home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 22 / AACD 22.iso / AACD / Graphics / FlashMandel / Sources / FlashMandelPPC.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-05-27  |  142.0 KB  |  4,317 lines

  1. /*******************************************************************************
  2. **
  3. **  Coded by Dino Papararo        LAST MODIFIED 23-Apr-2001
  4. **
  5. *******************************************************************************/
  6.  
  7. //#define STORMAMIGA
  8. //#define STORMAMIGA_OS3
  9.  
  10. //#include <stormamiga.h>
  11.  
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <math.h>
  15. #include <exec/exec.h>
  16. #include <powerpc/powerpc.h>
  17. #include <powerpc/memoryPPC.h>
  18. #include <clib/alib_protos.h>
  19. #include <clib/powerpc_protos.h>
  20. #include <intuition/intuition.h>
  21. #include <intuition/gadgetclass.h>
  22. #include <graphics/gfxbase.h>
  23. #include <graphics/scale.h>
  24. #include <devices/printer.h>
  25. #include <workbench/workbench.h>
  26. #include <iffp/ilbmapp.h>
  27. #include <proto/exec.h>
  28. #include <proto/dos.h>
  29. #include <proto/intuition.h>
  30. #include <proto/diskfont.h>
  31. #include <proto/graphics.h>
  32. #include <proto/gadtools.h>
  33. #include <proto/utility.h>
  34. #include <proto/iffparse.h>
  35. #include <proto/icon.h>
  36. #include <proto/asl.h>
  37. #include <proto/wb.h>
  38.  
  39. #include "flashmandel.h"
  40.  
  41. struct Library *PowerPCBase = NULL;
  42.  
  43. struct MandelChunk MANDChunk = {0};
  44.  
  45. struct RastPort TempRP;
  46.  
  47. struct BitMap *TempBM;
  48.  
  49. UBYTE *PixelLine;
  50.  
  51. UBYTE *GfxPpcMem;
  52.  
  53. TEXT MYFILE [MAX_FILELEN],PICTURESDIR [MAX_DIRLEN],PALETTESDIR [MAX_DIRLEN],MYPATH [MAX_PATHLEN],BAR_STRING [BARLEN],MYFONT [MAX_FILELEN],USERNAME [MAX_FILELEN];
  54.  
  55. TEXT CPU68K_STR [10],FPU68K_STR [10],CPUPPC_STR [10],FPUPPC_STR [10];
  56.  
  57. TEXT *MYDIR = NULL;
  58.  
  59. BOOL DEPTH_CHANGED;
  60.  
  61. WORD ZOOMLINE [PAIRS << 1] , MAX_ITERATIONS = 319,RETURNVALUE = 0;
  62.  
  63. LONG PRIORITY = DEF_STARTPRI,DELAY = 5L,__oslibversion = Lib_Version;
  64.  
  65. ULONG MASK = TMASK;
  66.  
  67. ULONG ELAPSEDTIME = NULL,COLORS,CPUINFO,UFLAGS = NULL, UITERATIONS = NULL;
  68.  
  69. LDouble RMIN=INIT_DEF_RMIN,RMAX=INIT_DEF_RMAX,IMIN=INIT_DEF_IMIN,IMAX=INIT_DEF_IMAX;
  70.  
  71. LDouble DEF_RMIN,DEF_RMAX,DEF_IMIN,DEF_IMAX,DEF_JKRE=INIT_DEF_JKRE,DEF_JKIM=INIT_DEF_JKIM,URMIN=0.0,URMAX=0.0,UIMIN=0.0,UIMAX=0.0,UJKRE=0.0,UJKIM=0.0;
  72.  
  73. LDouble INCREMREAL=0.0,INCREMIMAG=0.0,CRE=0.0,CIM=0.0,JKRE=0.0,JKIM=0.0;
  74.  
  75. ULONG *PALETTE;
  76.  
  77. CPTR *VINFO = NULL;
  78.  
  79. UBYTE (*COLORREMAP) (const LDouble,const LDouble,const LDouble);
  80.  
  81. VOID (*V_LINE) (struct RastPort *,const WORD,const WORD,const WORD);
  82.  
  83. VOID (*H_LINE) (struct RastPort *,const WORD,const WORD,const WORD);
  84.  
  85. UBYTE *DiskFontLibraryError   =  "I need at least DiskFontLibrary v39 or better, sorry !";
  86. UBYTE *IconLibraryError       =  "I need at least IconLibrary v39 or better, sorry !";
  87. UBYTE *GadToolsLibraryError   =  "I need at least GadToolsibrary v39 or better, sorry !";
  88. UBYTE *AslLibraryError        =  "I need at least AslLibrary v39 or better, sorry !";
  89. UBYTE *UtilityLibraryError    =  "I need at least UtilityLibrary v39 or better, sorry !";
  90. UBYTE *IFFParseLibraryError   =  "I need at least IFFParseLibrary v39 or better, sorry !";
  91. UBYTE *OpenDisplayError       =  "I need at least 8 colors, sorry.";
  92. UBYTE *NoMemForTempRastPort   =  "No mem for temp RastPort";
  93. UBYTE *FontError              =  "Font failed";
  94. UBYTE *NoMonitor              =  "No monitor";
  95. UBYTE *NoChips                =  "No chips";
  96. UBYTE *NoMem                  =  "No mem";
  97. UBYTE *NoChipMem              =  "No chipmem";
  98. UBYTE *PubNotUnique           =  "Pub not unique";
  99. UBYTE *UnknownMode            =  "Unknown mode";
  100. UBYTE *ScreenTooDeep          =  "Screen too deep";
  101. UBYTE *AttachScreen           =  "Attach screen failed";
  102. UBYTE *ModeNotAvailableError  =  "Mode not available";
  103. UBYTE *UnknownScrError        =  "Unknown screen error";
  104. UBYTE *VisualInfoError        =  "Visualinfo failed";
  105. UBYTE *WindowError            =  "Openwindow failed";
  106. UBYTE *MenuError              =  "Menu failed";
  107. UBYTE *GadgetError            =  "Gadget error";
  108. UBYTE *WindowGadgetError      =  "Window gadget error";
  109. UBYTE *PreviewWindowError     =  "Preview window failed";
  110. UBYTE *CreateDisplayError     =  "Createdisplay error";
  111. UBYTE *DimensionInfoError     =  "Dimensioninfo error";
  112. UBYTE *DisplayInfoError       =  "Displayinfo error";
  113. UBYTE *PaletteRequesterError  =  "Palette requester error";
  114. UBYTE *MakeDisplayError       =  "Display error";
  115. UBYTE *QueryMandPicError      =  "Not a FlashMandel picture !";
  116. UBYTE *LoadMandPicError       =  "Load picture error";
  117. UBYTE *SaveMandPicError       =  "Save picture error";
  118. UBYTE *LoadMandPalError       =  "Load palette error";
  119. UBYTE *SaveMandPalError       =  "Save palette error";
  120. UBYTE *NoMemForPPC            =  "No mem for memory buffer, only Mc 68k rendering allowed";
  121.  
  122. ULONG  CheckCPU      (ULONG CpuFlags);
  123. void   FreeBitMapSafety (struct BitMap *);
  124. BOOL   AllocTempRast (struct BitMap *,UWORD,UBYTE);
  125. void   PutPointer    (struct Window *,UWORD *,LONG,LONG,LONG,LONG,UBYTE);
  126. VOID   ClipIt        (WORD,WORD,struct Rectangle *,struct Rectangle *,struct Rectangle *,struct Rectangle *,struct Rectangle *,struct Rectangle *,BOOL);
  127. ULONG  ModeFallBack  (ULONG,WORD,WORD,WORD);
  128. void   SystemInfo    (struct Window *Win);
  129. LONG   About         (struct Window *);
  130. LONG   Choice        (struct Window *,TEXT *,TEXT *);
  131. LONG   CheckGFX      (VOID);
  132. UBYTE  GetMaxPlanes  (ULONG);
  133. void   AdjustRatio   (LDouble *,LDouble *,LDouble *,LDouble *,WORD,WORD,BOOL);
  134. VOID   ShowTime      (struct Window *,TEXT *,ULONG);
  135. ULONG  IntegerGad    (struct Window *,TEXT *,TEXT *,TEXT *,ULONG);
  136. VOID   CloseDisplay  (struct ILBMInfo *,CPTR *);
  137. LONG   MakeDisplay   (struct ILBMInfo *);
  138. BOOL   NewCoords     (struct Window *,const WORD,const WORD,const WORD,const WORD);
  139. BOOL   DrawFrame     (struct Window *,const WORD,const WORD,const WORD,const WORD);
  140. ULONG  DrawFractal   (struct Window *,const WORD,const WORD,const WORD,const WORD);
  141. BOOL   Preview       (struct Window *,LONG,LONG);
  142. BOOL   ShowCoords    (struct Window *);
  143. void   RestoreCoords (struct Window *);
  144. void   SaveCoords    (struct Window *,BOOL);
  145. BOOL   FileRequest   (struct Window *,TEXT *,TEXT *,BOOL,BOOL);
  146. BOOL   FontRequest   (struct Window *);
  147. BOOL   SMRequest     (struct ILBMInfo *);
  148. VOID   SetMenuStart  (struct Window *);
  149. VOID   SetMenuStop   (struct Window *);
  150. ULONG  ProcessMenu   (struct Window *,UWORD);
  151. BOOL   PickJuliaK    (struct Window *);
  152. void   CheckMenu     (struct Window *);
  153. void   ProcessMouse  (struct Window *,WORD,WORD);
  154. ULONG  HandleEvents  (struct ILBMInfo *);
  155. LONG   WinDump       (struct Window *);
  156. ULONG  Fail          (UBYTE *,ULONG);
  157. BOOL   PasteBitMap   (struct BitMap *,struct Window *,WORD,WORD);
  158. void   wbmain        (struct WBStartup *ArgMsg);
  159. LONG   main          (LONG,CONST_STRPTR *);
  160. LONG   MainProg      (VOID);
  161.  
  162. UBYTE LinearRemap     (const LDouble,const LDouble,const LDouble);
  163. UBYTE LogRemap        (const LDouble,const LDouble,const LDouble);
  164. UBYTE RepeatedRemap   (const LDouble,const LDouble,const LDouble);
  165. UBYTE SquareRootRemap (const LDouble,const LDouble,const LDouble);
  166. UBYTE OneRemap        (const LDouble,const LDouble,const LDouble);
  167. UBYTE TwoRemap        (const LDouble,const LDouble,const LDouble);
  168. UBYTE ThreeRemap      (const LDouble,const LDouble,const LDouble);
  169. UBYTE FourRemap       (const LDouble,const LDouble,const LDouble);
  170.  
  171. static ULONG HOOKCALL SMFilterFunc (REG (a0,struct Hook *),REG (a2,struct ScreenModeRequester *),REG (a1,ULONG));
  172.  
  173. struct Screen *OpenIdScreen (struct ILBMInfo *,WORD,WORD,WORD,ULONG);
  174. struct Window *OpenDisplay  (struct ILBMInfo *,WORD,WORD,WORD,ULONG);
  175. struct BitMap *CopyBitMap   (struct Window *,WORD,WORD,WORD,WORD);
  176.  
  177. struct Hook         SMFILTERHOOK      = {NULL,NULL,(VOID *) SMFilterFunc,NULL};
  178.  
  179. struct Border       MYBORDER          = {0,0,0,0,COMPLEMENT,PAIRS,ZOOMLINE,0};
  180.  
  181. struct TextAttr     MYFONTSTRUCT      = {DEF_FONTNAMESTR,DEF_FONTSIZE,FS_NORMAL,FPF_DISKFONT};
  182.  
  183. struct NewGadget    TEXTGAD           = {0,0,0,0,0,&MYFONTSTRUCT,0,0,0,0};
  184.  
  185. struct NewGadget    BUTTONGAD         = {0,0,0,0,0,&MYFONTSTRUCT,0,0,0,0};
  186.  
  187. struct NewGadget    CHECKBOXGAD       = {0,0,0,0,0,&MYFONTSTRUCT,0,0,0,0};
  188.  
  189. struct BitScaleArgs BSA               = {0,0,0,0,0,0,0,0,0,0,0,0,NULL,NULL,NULL,0,0,NULL,NULL};
  190.  
  191. struct Chunk COPYRIGHT_CHUNK = {NULL,ID_ILBM,ID_Copyright,sizeof (UBYTE) * strlen (VERSION "by " AUTHOR " " COPYRIGHT_DATE),VERSION "by " AUTHOR " " COPYRIGHT_DATE};
  192.  
  193. struct Chunk USERNAME_CHUNK  = {©RIGHT_CHUNK,ID_ILBM,ID_AUTH,sizeof (UBYTE) * MAX_FILELEN,USERNAME};
  194.  
  195. struct Chunk SPECIAL_CHUNK   = {NULL,ID_ILBM,ID_MAND,sizeof (struct MandelChunk),NULL};
  196.  
  197. UWORD PENS [] = {BLACK,DARK_GREY,WHITE,WHITE,DARK_GREY,LIGHT_GREY,DARK_GREY,LIGHT_GREY,DARK_GREY,WHITE,LIGHT_GREY,DARK_GREY,(UWORD) ~0};
  198.  
  199. /*
  200.  
  201. 01      0 DETAILPEN             SFONDO
  202. 02      1 BLOCKPEN              TESTO
  203. 03      1 TEXTPEN               TESTO EVIDENZIATO
  204. 04      2 SHINEPEN              BORDI CHIARI
  205. 05      1 SHADOWPEN             BORDI SCURI
  206. 06      3 FILLPEN               BARRA TITOLO FINESTRE ATTIVE
  207. 07      1 FILLTEXTPEN           TITOLO FINESTRE ATTIVE
  208. 08      0 BACKGROUNDPEN
  209. 09      2 HIGHLIGHTTEXTPEN
  210.  
  211. 10      1 BARDETAILPEN          TESTO NEI MENU
  212. 11      2 BARBLOCKPEN           SFONDO NEI MENU
  213. 12      1 BARTRIMPEN
  214.  
  215. */
  216.  
  217. ULONG COLORS_ECS [] = {32L << 16,
  218.                        0x00000000,0x00000000,0x00000000,
  219.                        0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
  220.                        0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,
  221.                        0x66666666,0x66666666,0x66666666,
  222.                        0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
  223.                        0xBBBBBBBB,0xBBBBBBBB,0xBBBBBBBB,
  224.                        0x77777777,0x77777777,0x77777777,
  225.                        0x33333333,0x33333333,0x33333333,
  226.                        0x33333333,0x33333333,0x00000000,
  227.                        0x77777777,0x77777777,0x00000000,
  228.                        0xBBBBBBBB,0xBBBBBBBB,0x00000000,
  229.                        0xFFFFFFFF,0xFFFFFFFF,0x00000000,
  230.                        0x00000000,0xFFFFFFFF,0x00000000,
  231.                        0x00000000,0xBBBBBBBB,0x00000000,
  232.                        0x00000000,0x77777777,0x00000000,
  233.                        0x00000000,0x33333333,0x00000000,
  234.                        0x33333333,0x00000000,0x33333333,
  235.                        0x77777777,0x00000000,0x77777777,
  236.                        0xBBBBBBBB,0x00000000,0xBBBBBBBB,
  237.                        0xFFFFFFFF,0x00000000,0xFFFFFFFF,
  238.                        0xFFFFFFFF,0x00000000,0x00000000,
  239.                        0xBBBBBBBB,0x00000000,0x00000000,
  240.                        0x77777777,0x00000000,0x00000000,
  241.                        0x33333333,0x00000000,0x00000000,
  242.                        0x00000000,0x33333333,0x33333333,
  243.                        0x00000000,0x77777777,0x77777777,
  244.                        0x00000000,0xBBBBBBBB,0xBBBBBBBB,
  245.                        0x00000000,0xFFFFFFFF,0xFFFFFFFF,
  246.                        0x00000000,0x00000000,0xFFFFFFFF,
  247.                        0x00000000,0x00000000,0xBBBBBBBB,
  248.                        0x00000000,0x00000000,0x77777777,
  249.                        0x00000000,0x00000000,0x33333333,
  250.                        NULL};
  251.  
  252.  
  253. ULONG COLORS_AGA []  =  {256L << 16,
  254.                          0x00000000,0x00000000,0x00000000, 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA, 0x66666666,0x66666666,0x66666666,
  255.                          0x9f9f9f9f,0x9f9f9f9f,0x9f9f9f9f, 0xafafafaf,0xafafafaf,0xafafafaf, 0xbfbfbfbf,0xbfbfbfbf,0xbfbfbfbf, 0xcfcfcfcf,0xcfcfcfcf,0xcfcfcfcf,
  256.                          0xdfdfdfdf,0xdfdfdfdf,0xdfdfdfdf, 0xefefefef,0xefefefef,0xefefefef, 0xdfdfdfdf,0xefefefef,0xffffffff, 0xcfcfcfcf,0xdfdfdfdf,0xefefefef,
  257.                          0xbfbfbfbf,0xcfcfcfcf,0xdfdfdfdf, 0xafafafaf,0xbfbfbfbf,0xcfcfcfcf, 0x9f9f9f9f,0xafafafaf,0xbfbfbfbf, 0x8f8f8f8f,0x9f9f9f9f,0xafafafaf,
  258.                          0x7f7f7f7f,0x8f8f8f8f,0x9f9f9f9f, 0x6f6f6f6f,0x7f7f7f7f,0x8f8f8f8f, 0x5f5f5f5f,0x6f6f6f6f,0x7f7f7f7f, 0x4f4f4f4f,0x5f5f5f5f,0x6f6f6f6f,
  259.                          0x3f3f3f3f,0x4f4f4f4f,0x5f5f5f5f, 0x2f2f2f2f,0x3f3f3f3f,0x4f4f4f4f, 0x1f1f1f1f,0x2f2f2f2f,0x3f3f3f3f, 0x0f0f0f0f,0x1f1f1f1f,0x2f2f2f2f,
  260.                          0x00000000,0x0f0f0f0f,0x1f1f1f1f, 0x1f1f1f1f,0x0f0f0f0f,0x1f1f1f1f, 0x2f2f2f2f,0x1f1f1f1f,0x2f2f2f2f, 0x3f3f3f3f,0x2f2f2f2f,0x3f3f3f3f,
  261.                          0x4f4f4f4f,0x3f3f3f3f,0x4f4f4f4f, 0x5f5f5f5f,0x4f4f4f4f,0x5f5f5f5f, 0x6f6f6f6f,0x5f5f5f5f,0x6f6f6f6f, 0x7f7f7f7f,0x6f6f6f6f,0x7f7f7f7f,
  262.                          0x8f8f8f8f,0x7f7f7f7f,0x8f8f8f8f, 0x9f9f9f9f,0x8f8f8f8f,0x9f9f9f9f, 0xafafafaf,0x9f9f9f9f,0xafafafaf, 0xbfbfbfbf,0xafafafaf,0xbfbfbfbf,
  263.                          0xcfcfcfcf,0xbfbfbfbf,0xcfcfcfcf, 0xdfdfdfdf,0xcfcfcfcf,0xdfdfdfdf, 0xefefefef,0xdfdfdfdf,0xefefefef, 0xffffffff,0xefefefef,0xffffffff,
  264.                          0xefefefef,0xffffffff,0xefefefef, 0xdfdfdfdf,0xefefefef,0xdfdfdfdf, 0xcfcfcfcf,0xdfdfdfdf,0xcfcfcfcf, 0xbfbfbfbf,0xcfcfcfcf,0xbfbfbfbf,
  265.                          0xafafafaf,0xbfbfbfbf,0xafafafaf, 0x9f9f9f9f,0xafafafaf,0x9f9f9f9f, 0x8f8f8f8f,0x9f9f9f9f,0x8f8f8f8f, 0x7f7f7f7f,0x8f8f8f8f,0x7f7f7f7f,
  266.                          0x6f6f6f6f,0x7f7f7f7f,0x6f6f6f6f, 0x5f5f5f5f,0x6f6f6f6f,0x5f5f5f5f, 0x4f4f4f4f,0x5f5f5f5f,0x4f4f4f4f, 0x3f3f3f3f,0x4f4f4f4f,0x3f3f3f3f,
  267.                          0x2f2f2f2f,0x3f3f3f3f,0x2f2f2f2f, 0x1f1f1f1f,0x2f2f2f2f,0x1f1f1f1f, 0x0f0f0f0f,0x1f1f1f1f,0x0f0f0f0f, 0x0f0f0f0f,0x1f1f1f1f,0x1f1f1f1f,
  268.                          0x1f1f1f1f,0x2f2f2f2f,0x2f2f2f2f, 0x2f2f2f2f,0x3f3f3f3f,0x3f3f3f3f, 0x3f3f3f3f,0x4f4f4f4f,0x4f4f4f4f, 0x4f4f4f4f,0x5f5f5f5f,0x5f5f5f5f,
  269.                          0x5f5f5f5f,0x6f6f6f6f,0x6f6f6f6f, 0x6f6f6f6f,0x7f7f7f7f,0x7f7f7f7f, 0x7f7f7f7f,0x8f8f8f8f,0x8f8f8f8f, 0x8f8f8f8f,0x9f9f9f9f,0x9f9f9f9f,
  270.                          0x9f9f9f9f,0xafafafaf,0xafafafaf, 0xafafafaf,0xbfbfbfbf,0xbfbfbfbf, 0xbfbfbfbf,0xcfcfcfcf,0xcfcfcfcf, 0xcfcfcfcf,0xdfdfdfdf,0xdfdfdfdf,
  271.                          0xdfdfdfdf,0xefefefef,0xefefefef, 0xefefefef,0xffffffff,0xffffffff, 0xffffffff,0xefefefef,0xefefefef, 0xefefefef,0xdfdfdfdf,0xdfdfdfdf,
  272.                          0xdfdfdfdf,0xcfcfcfcf,0xcfcfcfcf, 0xcfcfcfcf,0xbfbfbfbf,0xbfbfbfbf, 0xbfbfbfbf,0xafafafaf,0xafafafaf, 0xafafafaf,0x9f9f9f9f,0x9f9f9f9f,
  273.                          0x9f9f9f9f,0x8f8f8f8f,0x8f8f8f8f, 0x8f8f8f8f,0x7f7f7f7f,0x7f7f7f7f, 0x7f7f7f7f,0x6f6f6f6f,0x6f6f6f6f, 0x6f6f6f6f,0x5f5f5f5f,0x5f5f5f5f,
  274.                          0x5f5f5f5f,0x4f4f4f4f,0x4f4f4f4f, 0x4f4f4f4f,0x3f3f3f3f,0x3f3f3f3f, 0x3f3f3f3f,0x2f2f2f2f,0x2f2f2f2f, 0x2f2f2f2f,0x1f1f1f1f,0x1f1f1f1f,
  275.                          0x1f1f1f1f,0x0f0f0f0f,0x0f0f0f0f, 0x1f1f1f1f,0x1f1f1f1f,0x0f0f0f0f, 0x2f2f2f2f,0x2f2f2f2f,0x1f1f1f1f, 0x3f3f3f3f,0x3f3f3f3f,0x2f2f2f2f,
  276.                          0x4f4f4f4f,0x4f4f4f4f,0x3f3f3f3f, 0x5f5f5f5f,0x5f5f5f5f,0x4f4f4f4f, 0x6f6f6f6f,0x6f6f6f6f,0x5f5f5f5f, 0x7f7f7f7f,0x7f7f7f7f,0x6f6f6f6f,
  277.                          0x8f8f8f8f,0x8f8f8f8f,0x7f7f7f7f, 0x9f9f9f9f,0x9f9f9f9f,0x8f8f8f8f, 0xafafafaf,0xafafafaf,0x9f9f9f9f, 0xbfbfbfbf,0xbfbfbfbf,0xafafafaf,
  278.                          0xcfcfcfcf,0xcfcfcfcf,0xbfbfbfbf, 0xdfdfdfdf,0xdfdfdfdf,0xcfcfcfcf, 0xefefefef,0xefefefef,0xdfdfdfdf, 0xffffffff,0xffffffff,0xefefefef,
  279.                          0xefefefef,0xefefefef,0xffffffff, 0xdfdfdfdf,0xdfdfdfdf,0xefefefef, 0xcfcfcfcf,0xcfcfcfcf,0xdfdfdfdf, 0xbfbfbfbf,0xbfbfbfbf,0xcfcfcfcf,
  280.                          0xafafafaf,0xafafafaf,0xbfbfbfbf, 0x9f9f9f9f,0x9f9f9f9f,0xafafafaf, 0x8f8f8f8f,0x8f8f8f8f,0x9f9f9f9f, 0x7f7f7f7f,0x7f7f7f7f,0x8f8f8f8f,
  281.                          0x6f6f6f6f,0x6f6f6f6f,0x7f7f7f7f, 0x5f5f5f5f,0x5f5f5f5f,0x6f6f6f6f, 0x4f4f4f4f,0x4f4f4f4f,0x5f5f5f5f, 0x3f3f3f3f,0x3f3f3f3f,0x4f4f4f4f,
  282.                          0x2f2f2f2f,0x2f2f2f2f,0x3f3f3f3f, 0x1f1f1f1f,0x1f1f1f1f,0x2f2f2f2f, 0x0f0f0f0f,0x0f0f0f0f,0x1f1f1f1f, 0x0f0f0f0f,0x0f0f0f0f,0x00000000,
  283.                          0x1f1f1f1f,0x1f1f1f1f,0x00000000, 0x2f2f2f2f,0x2f2f2f2f,0x00000000, 0x3f3f3f3f,0x3f3f3f3f,0x00000000, 0x4f4f4f4f,0x4f4f4f4f,0x00000000,
  284.                          0x5f5f5f5f,0x5f5f5f5f,0x00000000, 0x6f6f6f6f,0x6f6f6f6f,0x00000000, 0x7f7f7f7f,0x7f7f7f7f,0x00000000, 0x8f8f8f8f,0x8f8f8f8f,0x00000000,
  285.                          0x9f9f9f9f,0x9f9f9f9f,0x00000000, 0xafafafaf,0xafafafaf,0x00000000, 0xbfbfbfbf,0xbfbfbfbf,0x00000000, 0xcfcfcfcf,0xcfcfcfcf,0x00000000,
  286.                          0xdfdfdfdf,0xdfdfdfdf,0x00000000, 0xefefefef,0xefefefef,0x00000000, 0xffffffff,0xffffffff,0x00000000, 0xefefefef,0xffffffff,0x00000000,
  287.                          0xdfdfdfdf,0xffffffff,0x00000000, 0xcfcfcfcf,0xffffffff,0x00000000, 0xbfbfbfbf,0xffffffff,0x00000000, 0xafafafaf,0xffffffff,0x00000000,
  288.                          0x9f9f9f9f,0xffffffff,0x00000000, 0x8f8f8f8f,0xffffffff,0x00000000, 0x7f7f7f7f,0xffffffff,0x00000000, 0x6f6f6f6f,0xffffffff,0x00000000,
  289.                          0x5f5f5f5f,0xffffffff,0x00000000, 0x4f4f4f4f,0xffffffff,0x00000000, 0x3f3f3f3f,0xffffffff,0x00000000, 0x2f2f2f2f,0xffffffff,0x00000000,
  290.                          0x1f1f1f1f,0xffffffff,0x00000000, 0x0f0f0f0f,0xffffffff,0x00000000, 0x00000000,0xffffffff,0x00000000, 0x00000000,0xefefefef,0x00000000,
  291.                          0x00000000,0xdfdfdfdf,0x00000000, 0x00000000,0xcfcfcfcf,0x00000000, 0x00000000,0xbfbfbfbf,0x00000000, 0x00000000,0xafafafaf,0x00000000,
  292.                          0x00000000,0x9f9f9f9f,0x00000000, 0x00000000,0x8f8f8f8f,0x00000000, 0x00000000,0x7f7f7f7f,0x00000000, 0x00000000,0x6f6f6f6f,0x00000000,
  293.                          0x00000000,0x5f5f5f5f,0x00000000, 0x00000000,0x4f4f4f4f,0x00000000, 0x00000000,0x3f3f3f3f,0x00000000, 0x00000000,0x2f2f2f2f,0x00000000,
  294.                          0x00000000,0x1f1f1f1f,0x00000000, 0x00000000,0x0f0f0f0f,0x00000000, 0x0f0f0f0f,0x00000000,0x0f0f0f0f, 0x1f1f1f1f,0x00000000,0x1f1f1f1f,
  295.                          0x2f2f2f2f,0x00000000,0x2f2f2f2f, 0x3f3f3f3f,0x00000000,0x3f3f3f3f, 0x4f4f4f4f,0x00000000,0x4f4f4f4f, 0x5f5f5f5f,0x00000000,0x5f5f5f5f,
  296.                          0x6f6f6f6f,0x00000000,0x6f6f6f6f, 0x7f7f7f7f,0x00000000,0x7f7f7f7f, 0x8f8f8f8f,0x00000000,0x8f8f8f8f, 0x9f9f9f9f,0x00000000,0x9f9f9f9f,
  297.                          0xafafafaf,0x00000000,0xafafafaf, 0xbfbfbfbf,0x00000000,0xbfbfbfbf, 0xcfcfcfcf,0x00000000,0xcfcfcfcf, 0xdfdfdfdf,0x00000000,0xdfdfdfdf,
  298.                          0xefefefef,0x00000000,0xefefefef, 0xffffffff,0x00000000,0xffffffff, 0xffffffff,0x00000000,0xefefefef, 0xffffffff,0x00000000,0xdfdfdfdf,
  299.                          0xffffffff,0x00000000,0xcfcfcfcf, 0xffffffff,0x00000000,0xbfbfbfbf, 0xffffffff,0x00000000,0xafafafaf, 0xffffffff,0x00000000,0x9f9f9f9f,
  300.                          0xffffffff,0x00000000,0x8f8f8f8f, 0xffffffff,0x00000000,0x7f7f7f7f, 0xffffffff,0x00000000,0x6f6f6f6f, 0xffffffff,0x00000000,0x5f5f5f5f,
  301.                          0xffffffff,0x00000000,0x4f4f4f4f, 0xffffffff,0x00000000,0x3f3f3f3f, 0xffffffff,0x00000000,0x2f2f2f2f, 0xffffffff,0x00000000,0x1f1f1f1f,
  302.                          0xffffffff,0x00000000,0x0f0f0f0f, 0xffffffff,0x00000000,0x00000000, 0xefefefef,0x00000000,0x00000000, 0xdfdfdfdf,0x00000000,0x00000000,
  303.                          0xcfcfcfcf,0x00000000,0x00000000, 0xbfbfbfbf,0x00000000,0x00000000, 0xafafafaf,0x00000000,0x00000000, 0x9f9f9f9f,0x00000000,0x00000000,
  304.                          0x8f8f8f8f,0x00000000,0x00000000, 0x7f7f7f7f,0x00000000,0x00000000, 0x6f6f6f6f,0x00000000,0x00000000, 0x5f5f5f5f,0x00000000,0x00000000,
  305.                          0x4f4f4f4f,0x00000000,0x00000000, 0x3f3f3f3f,0x00000000,0x00000000, 0x2f2f2f2f,0x00000000,0x00000000, 0x1f1f1f1f,0x00000000,0x00000000,
  306.                          0x0f0f0f0f,0x00000000,0x00000000, 0x00000000,0x0f0f0f0f,0x0f0f0f0f, 0x00000000,0x1f1f1f1f,0x1f1f1f1f, 0x00000000,0x2f2f2f2f,0x2f2f2f2f,
  307.                          0x00000000,0x3f3f3f3f,0x3f3f3f3f, 0x00000000,0x4f4f4f4f,0x4f4f4f4f, 0x00000000,0x5f5f5f5f,0x5f5f5f5f, 0x00000000,0x6f6f6f6f,0x6f6f6f6f,
  308.                          0x00000000,0x7f7f7f7f,0x7f7f7f7f, 0x00000000,0x8f8f8f8f,0x8f8f8f8f, 0x00000000,0x9f9f9f9f,0x9f9f9f9f, 0x00000000,0xafafafaf,0xafafafaf,
  309.                          0x00000000,0xbfbfbfbf,0xbfbfbfbf, 0x00000000,0xcfcfcfcf,0xcfcfcfcf, 0x00000000,0xdfdfdfdf,0xdfdfdfdf, 0x00000000,0xefefefef,0xefefefef,
  310.                          0x00000000,0xffffffff,0xffffffff, 0x00000000,0xefefefef,0xffffffff, 0x00000000,0xdfdfdfdf,0xffffffff, 0x00000000,0xcfcfcfcf,0xffffffff,
  311.                          0x00000000,0xbfbfbfbf,0xffffffff, 0x00000000,0xafafafaf,0xffffffff, 0x00000000,0x9f9f9f9f,0xffffffff, 0x00000000,0x8f8f8f8f,0xffffffff,
  312.                          0x00000000,0x7f7f7f7f,0xffffffff, 0x00000000,0x6f6f6f6f,0xffffffff, 0x00000000,0x5f5f5f5f,0xffffffff, 0x00000000,0x4f4f4f4f,0xffffffff,
  313.                          0x00000000,0x3f3f3f3f,0xffffffff, 0x00000000,0x2f2f2f2f,0xffffffff, 0x00000000,0x1f1f1f1f,0xffffffff, 0x00000000,0x0f0f0f0f,0xffffffff,
  314.                          0x00000000,0x00000000,0xffffffff, 0x00000000,0x00000000,0xefefefef, 0x00000000,0x00000000,0xdfdfdfdf, 0x00000000,0x00000000,0xcfcfcfcf,
  315.                          0x00000000,0x00000000,0xbfbfbfbf, 0x00000000,0x00000000,0xafafafaf, 0x00000000,0x00000000,0x9f9f9f9f, 0x00000000,0x00000000,0x8f8f8f8f,
  316.                          0x00000000,0x00000000,0x7f7f7f7f, 0x00000000,0x00000000,0x6f6f6f6f, 0x00000000,0x00000000,0x5f5f5f5f, 0x00000000,0x00000000,0x4f4f4f4f,
  317.                          0x00000000,0x00000000,0x3f3f3f3f, 0x00000000,0x00000000,0x2f2f2f2f, 0x00000000,0x00000000,0x1f1f1f1f, 0x00000000,0x00000000,0x0f0f0f0f,
  318.                          NULL};
  319.  
  320. CHIP UWORD ZoomPointer[] = {0x0000,0x0000,0x0100,0x0000,0x0100,0x0000,0x0000,0x0100,
  321.                             0x0000,0x0100,0x0100,0x0100,0x0100,0x0100,0x0000,0x0000,
  322.                             0xCC66,0x3C78,0x0000,0x0000,0x0100,0x0100,0x0100,0x0100,
  323.                             0x0000,0x0100,0x0000,0x0100,0x0100,0x0000,0x0100,0x0000,
  324.                             0x0000,0x0000};
  325.  
  326. struct NewMenu ProgMenu[] = { NM_TITLE,"Project",0,0,0,0,
  327.  
  328.                               NM_ITEM,"About...","A",NM_ITEMDISABLED,0,0,
  329.  
  330.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  331.  
  332.                               NM_ITEM,"System info...","N",NM_ITEMDISABLED,0,0,
  333.  
  334.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  335.  
  336.                               NM_ITEM,"Help...","H",NM_ITEMDISABLED,0,0,
  337.  
  338.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  339.  
  340.                               NM_ITEM,"Load picture...","L",NM_ITEMDISABLED,0,0,
  341.  
  342.                               NM_ITEM,"Save picture...","S",NM_ITEMDISABLED,0,0,
  343.  
  344.                               NM_ITEM,"Load palette...","Y",NM_ITEMDISABLED,0,0,
  345.  
  346.                               NM_ITEM,"Save palette...","E",NM_ITEMDISABLED,0,0,
  347.  
  348.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  349.  
  350.                               NM_ITEM,"Print...","D",NM_ITEMDISABLED,0,0,
  351.  
  352.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  353.  
  354.                               NM_ITEM,"Quit...","Q",NM_ITEMDISABLED,0,0,
  355.  
  356. /***************************************************************************************/
  357.  
  358.                               NM_TITLE,"Options",0,0,0,0,
  359.  
  360.                               NM_ITEM,"Title",0,NM_ITEMDISABLED,0,0,
  361.                               NM_SUB,"Title bar","O",CHECKIT|MENUTOGGLE|CHECKED,0,0,
  362.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  363.                               NM_SUB,"Last time","T",0,0,0,
  364.  
  365.                               NM_ITEM,"Limits...","C",NM_ITEMDISABLED,0,0,
  366.  
  367.                               NM_ITEM,"Iterations",0,NM_ITEMDISABLED,0,0,
  368.                               NM_SUB,"256",0,CHECKIT,~(1<<0),0,
  369.                               NM_SUB,"320",0,CHECKIT|CHECKED,~(1<<1),0,
  370.                               NM_SUB,"512",0,CHECKIT,~(1<<2),0,
  371.                               NM_SUB,"1024",0,CHECKIT,~(1<<3),0,
  372.                               NM_SUB,"2048",0,CHECKIT,~(1<<4),0,
  373.                               NM_SUB,"4096",0,CHECKIT,~(1<<5),0,
  374.                               NM_SUB,"8192",0,CHECKIT,~(1<<6),0,
  375.                               NM_SUB,"16384",0,CHECKIT,~(1<<7),0,
  376.                               NM_SUB,"32768",0,CHECKIT,~(1<<8),0,
  377.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  378.                               NM_SUB,"Custom...","I",CHECKIT,~(1<<10),0,
  379.  
  380.                               NM_ITEM,"Priority",0,0,0,0,
  381.                               NM_SUB,"-5","%",CHECKIT,~(1<<0),0,
  382.                               NM_SUB,"-4","$",CHECKIT,~(1<<1),0,
  383.                               NM_SUB,"-3","£",CHECKIT,~(1<<2),0,
  384.                               NM_SUB,"-2","\"",CHECKIT,~(1<<3),0,
  385.                               NM_SUB,"-1","!",CHECKIT,~(1<<4),0,
  386.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  387.                               NM_SUB," 0","0",CHECKIT,~(1<<6),0,
  388.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  389.                               NM_SUB,"+1","1",CHECKIT,~(1<<8),0,
  390.                               NM_SUB,"+2","2",CHECKIT,~(1<<9),0,
  391.                               NM_SUB,"+3","3",CHECKIT,~(1<<10),0,
  392.                               NM_SUB,"+4","4",CHECKIT,~(1<<11),0,
  393.                               NM_SUB,"+5","5",CHECKIT,~(1<<12),0,
  394.  
  395.                               NM_ITEM,"Color remap",0,0,0,0,
  396.                               NM_SUB,"Linerar","6",CHECKIT,~(1<<0),0,
  397.                               NM_SUB,"Ln (x)","7",CHECKIT,~(1<<1),0,
  398.                               NM_SUB,"Repeated","8",CHECKIT,~(1<<2),0,
  399.                               NM_SUB,"Sqrt (x)","9",CHECKIT,~(1<<3),0,
  400.                               NM_SUB,"x²-x","&",CHECKIT,~(1<<4),0,
  401.                               NM_SUB,"Sqrt (x³-x²-x)","/",CHECKIT,~(1<<5),0,
  402.                               NM_SUB,"Sinh (Ln (x³))","(",CHECKIT,~(1<<6),0,
  403.                               NM_SUB,"Cosh (Log (x³))",")",CHECKIT,~(1<<7),0,
  404.  
  405.                               NM_ITEM,"Fractal type",0,0,0,0,
  406.                               NM_SUB,"Julia","J",CHECKIT,~(1<<0),0,
  407.                               NM_SUB,"Mandelbrot","M",CHECKIT,~(1<<1),0,
  408.  
  409.                               NM_ITEM,"Processor",0,0,0,0,
  410.                               NM_SUB,"68k","-",CHECKIT,~(1<<0),0,
  411.                               NM_SUB,"Ppc","+",CHECKIT,~(1<<1),0,
  412.  
  413. /***************************************************************************************/
  414.  
  415.                               NM_TITLE,"Calculate",0,0,0,0,
  416.  
  417.                               NM_ITEM,"Preview","W",NM_ITEMDISABLED,0,0,
  418.  
  419.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  420.  
  421.                               NM_ITEM,"Recalculate","R",NM_ITEMDISABLED,0,0,
  422.  
  423.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  424.  
  425.                               NM_ITEM,"Undo","U",NM_ITEMDISABLED,0,0,
  426.  
  427.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  428.  
  429.                               NM_ITEM,"Zoom","Z",NM_ITEMDISABLED,0,0,
  430.  
  431.                               NM_ITEM,"Stop","X",0,0,0,
  432.  
  433. /***************************************************************************************/
  434.  
  435.                               NM_TITLE,"Video",0,0,0,0,
  436.  
  437.                               NM_ITEM,"Cycle",0,NM_ITEMDISABLED,0,0,
  438.                               NM_SUB,"Forward",">",0,0,0,
  439.                               NM_SUB,"Backward","<",0,0,0,
  440.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  441.                               NM_SUB,"Delay...",".",0,0,0,
  442.  
  443.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  444.  
  445.                               NM_ITEM,"Palette...","P",NM_ITEMDISABLED,0,0,
  446.  
  447.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  448.  
  449.                               NM_ITEM,"Screen mode...","V",NM_ITEMDISABLED,0,0,
  450.  
  451.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  452.  
  453.                               NM_ITEM,"Font settings...","F",NM_ITEMDISABLED,0,0,
  454.  
  455.                               NM_END,0,0,0,0,0 };
  456.  
  457.  
  458. struct Menu *MAINMENU = NULL;
  459.  
  460. struct BitMap *MYBITMAP = NULL;
  461.  
  462. struct Task *THISTASK = NULL;
  463.  
  464. struct TextFont *NEWFONT = NULL;
  465.  
  466. struct ILBMInfo MYILBM = {0};
  467.  
  468. LONG IlbmProps[] = { ID_ILBM, ID_BMHD, ID_ILBM, ID_CMAP, ID_ILBM, ID_CAMG, ID_ILBM, ID_MAND, ID_ILBM, ID_AUTH, ID_ILBM, ID_Copyright, TAG_DONE };
  469.  
  470. LONG IlbmCollects[] = { TAG_DONE };
  471.  
  472. LONG IlbmStops[] = { ID_ILBM, ID_BODY, TAG_DONE };
  473.  
  474. IMPORT void SAVEDS CalcFractalPPC (struct MandelChunk *,UBYTE *);
  475.  
  476. IMPORT WORD ASMCALL Mandel68K (REG (d0,WORD),REG (fp0,long long double),REG (fp1,long long double));
  477.  
  478. IMPORT WORD ASMCALL Julia68K (REG (d0,WORD),REG (fp0,long long double),REG (fp1,long long double),REG (fp2,long long double),REG (fp3,long long double));
  479.  
  480. IMPORT BOOL ModifyPalette (struct Window *,WORD,WORD,ULONG *);
  481.  
  482. IMPORT BOOL ScalePalette (struct Window *,ULONG *,ULONG,ULONG);
  483.  
  484. IMPORT BOOL Fade (struct Window *,ULONG *,ULONG,ULONG,BOOL);
  485.  
  486. IMPORT BOOL Cycle (struct Window *,ULONG,BOOL);
  487.  
  488. IMPORT LONG QueryMandPic (struct ILBMInfo *,struct MandelChunk *,UBYTE *);
  489.  
  490. IMPORT LONG LoadMandPic (struct ILBMInfo *,UBYTE *);
  491.  
  492. IMPORT LONG SaveMandPic (struct ILBMInfo *,struct Chunk *,struct Chunk *,UBYTE *);
  493.  
  494. IMPORT LONG LoadPalette (struct ILBMInfo *,UBYTE *);
  495.  
  496. IMPORT LONG SavePalette (struct ILBMInfo *,struct Chunk *,UBYTE *);
  497.  
  498.  
  499. /**************************************************************************************************************/
  500.  
  501. void wbmain (struct WBStartup *ArgMsg)
  502. {
  503. LONG ReturnCode;
  504.  
  505. CONST_STRPTR *IconToolTypes;
  506.  
  507. BPTR OldDir = NULL;
  508.  
  509. struct WBArg *Wb_Arg = NULL;
  510.  
  511. struct DiskObject *ActDiskObject = NULL;
  512.  
  513.  PowerPCBase = OpenLibrary (POWERPCNAME,14);
  514.  
  515.  Wb_Arg = ArgMsg->sm_ArgList;         /* Get first WB-Message */
  516.  
  517.  if (ArgMsg->sm_NumArgs)
  518.  {
  519.     if (Wb_Arg->wa_Lock)
  520.     {
  521.        OldDir = CurrentDir (Wb_Arg->wa_Lock);
  522.  
  523.        if (ActDiskObject = GetDiskObject (Wb_Arg->wa_Name))
  524.        {
  525.           IconToolTypes = (CONST_STRPTR *) ActDiskObject->do_ToolTypes;
  526.  
  527.           MYILBM.Bmhd.w = ArgInt (IconToolTypes,"SCREENWIDTH",DEF_WIDTH);
  528.           MYILBM.Bmhd.h = ArgInt (IconToolTypes,"SCREENHEIGHT",DEF_HEIGHT);
  529.           MYILBM.Bmhd.nPlanes = ArgInt (IconToolTypes,"SCREENDEPTH",MAX_DEPTH);
  530.  
  531.           sscanf (ArgString (IconToolTypes,"SCREENMODE",DEF_MONITORSTR),"%lx",&MYILBM.camg);
  532.  
  533.           RMIN = strtod (ArgString (IconToolTypes,"REALMIN",INIT_DEF_RMINSTR),NULL);
  534.           RMAX = strtod (ArgString (IconToolTypes,"REALMAX",INIT_DEF_RMAXSTR),NULL);
  535.           IMIN = strtod (ArgString (IconToolTypes,"IMAGMIN",INIT_DEF_IMINSTR),NULL);
  536.           IMAX = strtod (ArgString (IconToolTypes,"IMAGMAX",INIT_DEF_IMAXSTR),NULL);
  537.  
  538.           if (ArgInt (IconToolTypes,"USEPPC",FALSE)) MANDChunk.Flags |= PPC_BIT;
  539.  
  540.           else MANDChunk.Flags |= MC68K_BIT;
  541.  
  542.           if (ArgInt (IconToolTypes,"STARTWITHJULIA",FALSE)) MANDChunk.Flags |= JULIA_BIT;
  543.  
  544.           else MANDChunk.Flags |= MANDEL_BIT;
  545.  
  546.           switch (ArgInt (IconToolTypes,"COLORSREMAP",FALSE))
  547.           {
  548.              case 0: MANDChunk.Flags |= LINEAR_BIT;
  549.  
  550.                      break;
  551.  
  552.              case 1: MANDChunk.Flags |= LOG_BIT;
  553.  
  554.                      break;
  555.  
  556.              case 2: MANDChunk.Flags |= REPEATED_BIT;
  557.  
  558.                      break;
  559.  
  560.              case 3: MANDChunk.Flags |= SQUARE_BIT;
  561.  
  562.                      break;
  563.  
  564.              case 4: MANDChunk.Flags |= ONE_BIT;
  565.  
  566.                      break;
  567.  
  568.              case 5: MANDChunk.Flags |= TWO_BIT;
  569.  
  570.                      break;
  571.  
  572.              case 6: MANDChunk.Flags |= THREE_BIT;
  573.  
  574.                      break;
  575.  
  576.              case 7: MANDChunk.Flags |= FOUR_BIT;
  577.  
  578.                      break;
  579.  
  580.             default: MANDChunk.Flags |= LINEAR_BIT;
  581.  
  582.                      break;
  583.           }
  584.  
  585.           JKRE = strtod (ArgString (IconToolTypes,"JULIACONSTREAL",INIT_DEF_JKRESTR),NULL);
  586.           JKIM = strtod (ArgString (IconToolTypes,"JULIACONSTIMAG",INIT_DEF_JKIMSTR),NULL);
  587.  
  588.           strncpy (USERNAME,ArgString (IconToolTypes,"USERNAME",DEF_USERNAMESTR),MAX_FILELEN);
  589.  
  590.           MYFONTSTRUCT.ta_Name = strncpy (MYFONT,ArgString (IconToolTypes,"FONTNAME",DEF_FONTNAMESTR),MAX_FILELEN);
  591.  
  592.           MYFONTSTRUCT.ta_YSize = ArgInt (IconToolTypes,"FONTSIZE",DEF_FONTSIZE);
  593.  
  594.           PRIORITY = ArgInt (IconToolTypes,"STARTPRI",DEF_STARTPRI);
  595.  
  596.           FreeDiskObject (ActDiskObject);
  597.  
  598.           MYILBM.Bmhd.w = MIN (MAX_WIDTH,MAX (MYILBM.Bmhd.w,DEF_WIDTH));
  599.  
  600.           MYILBM.Bmhd.h = MIN (MAX_HEIGHT,MAX (MYILBM.Bmhd.h,DEF_HEIGHT));
  601.  
  602.           MYILBM.Bmhd.nPlanes = MIN (MAX_DEPTH,MAX (MYILBM.Bmhd.nPlanes,MIN_DEPTH));
  603.  
  604.           MYFONTSTRUCT.ta_YSize = MIN (MAX_FONTSIZE,MAX (MYFONTSTRUCT.ta_YSize,MIN_FONTSIZE));
  605.  
  606.           PRIORITY = MIN (5,MAX (PRIORITY,-5));
  607.  
  608.           ReturnCode = MainProg ();
  609.        }
  610.  
  611.        CurrentDir (OldDir);
  612.     }
  613.  
  614.     else goto defaults;
  615.   }
  616.  
  617.   else goto defaults;
  618.  
  619.   if (PowerPCBase) CloseLibrary (PowerPCBase);
  620.  
  621.   exit (ReturnCode);
  622.  
  623. defaults:
  624.  
  625.   MYILBM.camg = DEF_MONITOR;
  626.  
  627.   MYILBM.Bmhd.w = DEF_WIDTH;
  628.  
  629.   MYILBM.Bmhd.h = DEF_HEIGHT;
  630.  
  631.   MYILBM.Bmhd.nPlanes = (CheckGFX () ? MAX_DEPTH : DEF_DEPTH);
  632.  
  633.   MANDChunk.Flags |= (PPC_BIT|LINEAR_BIT|MANDEL_BIT|REAL_BIT);
  634.  
  635.   strcpy (USERNAME,DEF_USERNAMESTR);
  636.  
  637.   ReturnCode = MainProg ();
  638.  
  639.   if (PowerPCBase) CloseLibrary (PowerPCBase);
  640.  
  641.   exit (ReturnCode);
  642. }
  643.  
  644. LONG main (LONG Argc,CONST_STRPTR *Argv)
  645. {
  646. LONG ReturnCode;
  647.  
  648.   PowerPCBase = OpenLibrary (POWERPCNAME,14);
  649.  
  650.   MYILBM.camg = DEF_MONITOR;
  651.  
  652.   MYILBM.Bmhd.w = DEF_WIDTH;
  653.  
  654.   MYILBM.Bmhd.h = DEF_HEIGHT;
  655.  
  656.   MYILBM.Bmhd.nPlanes = (CheckGFX () ? MAX_DEPTH : DEF_DEPTH);
  657.  
  658.   MANDChunk.Flags |= (PPC_BIT|LINEAR_BIT|MANDEL_BIT|REAL_BIT);
  659.  
  660.   strcpy (USERNAME,DEF_USERNAMESTR);
  661.  
  662.   ReturnCode = MainProg ();
  663.  
  664.   if (PowerPCBase) CloseLibrary (PowerPCBase);
  665.  
  666.   return ReturnCode;
  667. }
  668.  
  669. LONG MainProg (VOID)
  670. {
  671.      CPUINFO = CheckCPU (SysBase->AttnFlags);
  672.  
  673.      if (ModeNotAvailable (MYILBM.camg)) MYILBM.camg = ModeFallBack (MYILBM.camg,MYILBM.Bmhd.w,MYILBM.Bmhd.h,MYILBM.Bmhd.nPlanes);
  674.  
  675.      if (MYILBM.Bmhd.nPlanes > GetMaxPlanes (MYILBM.camg)) MYILBM.Bmhd.nPlanes = GetMaxPlanes (MYILBM.camg);
  676.  
  677.      if (MYILBM.Bmhd.nPlanes < MIN_DEPTH)
  678.      {
  679.         Fail (OpenDisplayError,20L);
  680.  
  681.         goto End;
  682.      }
  683.  
  684.      PALETTE = (CheckGFX () ? COLORS_AGA : COLORS_ECS);
  685.  
  686.      if ((RMIN >= RMAX) || (IMIN >= IMAX))
  687.      {
  688.        DEF_RMIN = INIT_DEF_RMIN;
  689.  
  690.        DEF_RMAX = INIT_DEF_RMAX;
  691.  
  692.        DEF_IMIN = INIT_DEF_IMIN;
  693.  
  694.        DEF_IMAX = INIT_DEF_IMAX;
  695.      }
  696.  
  697.      else
  698.      {
  699.        DEF_RMIN = RMIN;
  700.  
  701.        DEF_RMAX = RMAX;
  702.  
  703.        DEF_IMIN = IMIN;
  704.  
  705.        DEF_IMAX = IMAX;
  706.      }
  707.  
  708.      MYILBM.ParseInfo.propchks = IlbmProps;
  709.  
  710.      MYILBM.ParseInfo.collectchks = IlbmCollects;
  711.  
  712.      MYILBM.ParseInfo.stopchks = IlbmStops;
  713.  
  714.      MYILBM.Bmhd.pageWidth  = 0;
  715.  
  716.      MYILBM.Bmhd.pageHeight = 0;
  717.  
  718.      MYILBM.stype = CUSTOMSCREEN | SCREENQUIET;
  719.  
  720.      MYILBM.TBState = TMASK & MASK;
  721.  
  722.      MYILBM.ucliptype = OSCAN_TEXT;
  723.  
  724.      MYILBM.EHB = FALSE;
  725.  
  726.      MYILBM.Autoscroll = TRUE;
  727.  
  728.      MYILBM.IFFPFlags = NULL;
  729.  
  730.      if (MAINMENU = CreateMenus (ProgMenu,TAG_END))
  731.      {
  732.         if (MYILBM.Bmhd.nPlanes < 6)
  733.         {
  734.            MAX_ITERATIONS = 255;
  735.  
  736.            ItemAddress (MAINMENU,FULLMENUNUM (1,2,1))->Flags &= ~CHECKED;
  737.  
  738.            ItemAddress (MAINMENU,FULLMENUNUM (1,2,0))->Flags |= CHECKED;
  739.         }
  740.  
  741.        switch (PRIORITY)
  742.         {
  743.           case -5: ItemAddress (MAINMENU,FULLMENUNUM (1,3,0))->Flags |= CHECKED;
  744.  
  745.                    break;
  746.  
  747.           case -4: ItemAddress (MAINMENU,FULLMENUNUM (1,3,1))->Flags |= CHECKED;
  748.  
  749.                    break;
  750.  
  751.           case -3: ItemAddress (MAINMENU,FULLMENUNUM (1,3,2))->Flags |= CHECKED;
  752.  
  753.                    break;
  754.  
  755.           case -2: ItemAddress (MAINMENU,FULLMENUNUM (1,3,3))->Flags |= CHECKED;
  756.  
  757.                    break;
  758.  
  759.           case -1: ItemAddress (MAINMENU,FULLMENUNUM (1,3,4))->Flags |= CHECKED;
  760.  
  761.                    break;
  762.  
  763.           case  0: ItemAddress (MAINMENU,FULLMENUNUM (1,3,6))->Flags |= CHECKED;
  764.  
  765.                    break;
  766.  
  767.           case  1: ItemAddress (MAINMENU,FULLMENUNUM (1,3,8))->Flags |= CHECKED;
  768.  
  769.                    break;
  770.  
  771.           case  2: ItemAddress (MAINMENU,FULLMENUNUM (1,3,9))->Flags |= CHECKED;
  772.  
  773.                    break;
  774.  
  775.           case  3: ItemAddress (MAINMENU,FULLMENUNUM (1,3,10))->Flags |= CHECKED;
  776.  
  777.                    break;
  778.  
  779.           case  4: ItemAddress (MAINMENU,FULLMENUNUM (1,3,11))->Flags |= CHECKED;
  780.  
  781.                    break;
  782.  
  783.           case  5: ItemAddress (MAINMENU,FULLMENUNUM (1,3,12))->Flags |= CHECKED;
  784.  
  785.                    break;
  786.         }
  787.  
  788.         SetTaskPri (FindTask (NULL),PRIORITY);
  789.  
  790.         if (MANDChunk.Flags & LINEAR_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,0))->Flags |= CHECKED;
  791.  
  792.         else if (MANDChunk.Flags & LOG_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,1))->Flags |= CHECKED;
  793.  
  794.              else if (MANDChunk.Flags & REPEATED_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,2))->Flags |= CHECKED;
  795.  
  796.                   else if (MANDChunk.Flags & SQUARE_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,3))->Flags |= CHECKED;
  797.  
  798.         if (MANDChunk.Flags & JULIA_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,0))->Flags |= CHECKED;
  799.  
  800.         else if (MANDChunk.Flags & MANDEL_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,1))->Flags |= CHECKED;
  801.  
  802.  
  803.         if (CPUINFO & (CPU_603|CPU_603e|CPU_604|CPU_604e|CPU_620))
  804.         {
  805.            if (MANDChunk.Flags & PPC_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,6,1))->Flags |= CHECKED;
  806.  
  807.            else ItemAddress (MAINMENU,FULLMENUNUM (1,6,0))->Flags |= CHECKED;
  808.         }
  809.  
  810.         else
  811.         {
  812.            ItemAddress (MAINMENU,FULLMENUNUM (1,6,NOSUB))->Flags |= NM_ITEMDISABLED;
  813.  
  814.            MANDChunk.Flags &= ~PPC_BIT;
  815.  
  816.            MANDChunk.Flags |= MC68K_BIT;
  817.  
  818.         }
  819.  
  820.         if (COLORS = MakeDisplay (&MYILBM))
  821.         {
  822.            COLORS -= RESERVED_PENS;
  823.  
  824.            SaveCoords (MYILBM.win,FALSE);
  825.  
  826.            MANDChunk.LeftEdge = MYILBM.win->LeftEdge;
  827.  
  828.            MANDChunk.TopEdge = MYILBM.win->TopEdge;
  829.  
  830.            MANDChunk.Width = MYILBM.win->Width;
  831.  
  832.            MANDChunk.Height = MYILBM.win->Height;
  833.  
  834.            MANDChunk.RMin = RMIN;
  835.  
  836.            MANDChunk.RMax = RMAX;
  837.  
  838.            MANDChunk.IMin = IMIN;
  839.  
  840.            MANDChunk.IMax = IMAX;
  841.  
  842.            MANDChunk.Iterations = MAX_ITERATIONS + 1L;
  843.  
  844.            SPECIAL_CHUNK.ch_Data = &MANDChunk;
  845.  
  846.            PutPointer (MYILBM.win,0,0,0,0,0,BUSY_POINTER);
  847.  
  848.            ELAPSEDTIME = DrawFractal (MYILBM.win,MYILBM.win->LeftEdge,MYILBM.win->TopEdge,MYILBM.win->Width,MYILBM.win->Height);
  849.  
  850.            PutPointer (MYILBM.win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  851.  
  852.            SetMenuStart (MYILBM.win);
  853.  
  854.            ShowTime (MYILBM.win,"Rendering elapsed time:",ELAPSEDTIME);
  855.  
  856.            ModifyIDCMP (MYILBM.win,NULL);
  857.  
  858.            ClearMenuStrip (MYILBM.win);
  859.  
  860.            About (MYILBM.win);
  861.  
  862.            ResetMenuStrip (MYILBM.win,MAINMENU);
  863.  
  864.            ModifyIDCMP (MYILBM.win,IDCMP_STANDARD);
  865.  
  866.            Execute (ASSIGNCURRENTDIR,NULL,NULL);
  867.  
  868.            do
  869.            {
  870.              while (HandleEvents (&MYILBM) & NEWDISPLAY_MSG)
  871.              {
  872.                    if (SMRequest (&MYILBM))
  873.                    {
  874.                       if (ZMASK & MASK)
  875.                       {
  876.                          DrawBorder (MYILBM.wrp,&MYBORDER,0,0);
  877.  
  878.                          MASK &= ~ZMASK;
  879.                       }
  880.  
  881.                       if (MYILBM.win->RPort->BitMap->Depth <= MYILBM.Bmhd.nPlanes)
  882.                       {
  883.                          MYBITMAP = CopyBitMap (MYILBM.win,MYILBM.win->LeftEdge,MYILBM.win->TopEdge,MYILBM.win->Width,MYILBM.win->Height);
  884.                       }
  885.  
  886.                       Fade (MYILBM.win,PALETTE,25L,1L,TOBLACK);
  887.  
  888.                       CloseDisplay (&MYILBM,VINFO);
  889.  
  890.                       MYILBM.Bmhd.pageWidth  = 0;
  891.  
  892.                       MYILBM.Bmhd.pageHeight = 0;
  893.  
  894.                       COLORS = MakeDisplay (&MYILBM);
  895.  
  896.                       if (COLORS)
  897.                       {
  898.                          COLORS -= RESERVED_PENS;
  899.  
  900.                          PasteBitMap (MYBITMAP,MYILBM.win,(WORD) GetBitMapAttr (MYBITMAP,BMA_WIDTH),(WORD) GetBitMapAttr (MYBITMAP,BMA_HEIGHT));
  901.  
  902.                          if (Choice (MYILBM.win,"Rendering requester","Screen propreties are changed.\nImage and colors can be inaccurate.\n\nRecalculate ?"))
  903.                          {
  904.                             SetMenuStop (MYILBM.win);
  905.  
  906.                             PutPointer (MYILBM.win,0,0,0,0,0,BUSY_POINTER);
  907.  
  908.                             ELAPSEDTIME = DrawFractal (MYILBM.win,MYILBM.win->LeftEdge,MYILBM.win->TopEdge,MYILBM.win->Width,MYILBM.win->Height);
  909.  
  910.                             PutPointer (MYILBM.win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  911.  
  912.                             SetMenuStart (MYILBM.win);
  913.  
  914.                             ShowTime (MYILBM.win,"Rendering elapsed time:",ELAPSEDTIME);
  915.                          }
  916.                       }
  917.  
  918.                       else
  919.                       {
  920.                             Fail (MakeDisplayError,20L);
  921.  
  922.                             break;
  923.                       }
  924.                    }
  925.              }
  926.  
  927.              if (RETURNVALUE >= 20L) break;
  928.  
  929.            } while (! Choice (MYILBM.win,"Exit requester","Are you sure ?"));
  930.  
  931.            if (BMASK & MASK) FreeBitMapSafety (MYBITMAP);
  932.  
  933.            Execute (ASSIGNREMOVE,NULL,NULL);
  934.         }
  935.  
  936.         else Fail (MakeDisplayError,20L);
  937.  
  938.         Fade (MYILBM.win,PALETTE,50L,1L,TOBLACK);
  939.  
  940.         CloseDisplay (&MYILBM,VINFO);
  941.  
  942.         FreeMenus (MAINMENU);
  943.    }
  944.  
  945.    else Fail (MenuError,20L);
  946.  
  947. End:
  948.  
  949.   return (RETURNVALUE);
  950. }
  951.  
  952.   /***********************************************************************************************************/
  953.  
  954. void PutPointer (struct Window *Win,UWORD *PointerImage,LONG Width,LONG Height,LONG XOrigin,LONG YOrigin,UBYTE Type)
  955. {
  956.   switch (Type)
  957.   {
  958.      case CLEAR_POINTER:  SetWindowPointer (Win,TAG_END);
  959.  
  960.                           break;
  961.  
  962.      case BUSY_POINTER:   SetWindowPointer (Win,WA_BusyPointer,TRUE,TAG_END);
  963.  
  964.                           break;
  965.  
  966.      case ZOOM_POINTER:   SetPointer (Win,PointerImage,Height,Width,XOrigin,YOrigin);
  967.   }
  968. }
  969.  
  970. UBYTE GetMaxPlanes (ULONG ModeID)
  971. {
  972. DisplayInfoHandle DisplayHandle;
  973.  
  974. struct DimensionInfo DimensionInfo;
  975.  
  976. UBYTE Planes = 0;
  977.  
  978.   DisplayHandle = FindDisplayInfo (ModeID);
  979.  
  980.   if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DimensionInfo,sizeof (struct DimensionInfo),DTAG_DIMS,ModeID))
  981.   {
  982.      Planes = DimensionInfo.MaxDepth;
  983.   }
  984.  
  985.   else Fail (DimensionInfoError,20L);
  986.  
  987.   return Planes;
  988. }
  989.  
  990. ULONG CheckCPU (ULONG CpuFlags)
  991. {
  992. ULONG CpuMask = NULL,PPCMask = NULL;
  993.  
  994.  if (AFF_68060 & CpuFlags) CpuMask |= CPU_060,strcpy (CPU68K_STR,"68060\0");
  995.  
  996.  else if (AFF_68040 & CpuFlags) CpuMask |= CPU_040,strcpy (CPU68K_STR,"68040\0");
  997.  
  998.       else if (AFF_68030 & CpuFlags) CpuMask |= CPU_030,strcpy (CPU68K_STR,"68030\0");
  999.  
  1000.            else if (AFF_68020 & CpuFlags) CpuMask |= CPU_020,strcpy (CPU68K_STR,"68020\0");
  1001.  
  1002.                 else if (AFF_68010 & CpuFlags) CpuMask |= CPU_010,strcpy (CPU68K_STR,"68010\0");
  1003.  
  1004.                      else if (! (CpuMask & (CPU_060|CPU_040|CPU_030|CPU_020|CPU_010))) strcpy (CPU68K_STR,"68000\0");
  1005.  
  1006.  if (AFF_FPU40 & CpuFlags) CpuMask |= FPU_040,strcpy (FPU68K_STR,"Builtin\0");
  1007.  
  1008.  else if (AFF_68882 & CpuFlags) CpuMask |= FPU_882,strcpy (FPU68K_STR,"68882\0");
  1009.  
  1010.       else if (AFF_68881 & CpuFlags) CpuMask |= FPU_881,strcpy (FPU68K_STR,"68881\0");
  1011.  
  1012.            else if (! (CpuMask & (FPU_040|FPU_882|FPU_881))) strcpy (FPU68K_STR,"None|0");
  1013.  
  1014.  if (PowerPCBase)
  1015.  {
  1016.     PPCMask = GetCPU ();
  1017.  
  1018.     if (CPUF_603 & PPCMask) CpuMask |= CPU_603,strcpy (CPUPPC_STR,"603\0"),strcpy (FPUPPC_STR,"Builtin\0");
  1019.  
  1020.     else if (CPUF_603E & PPCMask) CpuMask |= CPU_603e,strcpy (CPUPPC_STR,"603e\0"),strcpy (FPUPPC_STR,"Builtin\0");
  1021.  
  1022.          else if (CPUF_604 & PPCMask) CpuMask |= CPU_604,strcpy (CPUPPC_STR,"604\0"),strcpy (FPUPPC_STR,"Builtin\0");
  1023.  
  1024.               else if (CPUF_604E & PPCMask) CpuMask |= CPU_604e,strcpy (CPUPPC_STR,"604e\0"),strcpy (FPUPPC_STR,"Builtin\0");
  1025.  
  1026.                    else if (CPUF_620 & PPCMask) CpuMask |= CPU_620,strcpy (CPUPPC_STR,"620\0"),strcpy (FPUPPC_STR,"Builtin\0");
  1027.  
  1028.                         else if (! (CpuMask & (CPU_603|CPU_603e|CPU_604|CPU_604e|CPU_620))) strcpy (CPUPPC_STR,"None\0"),strcpy (FPUPPC_STR,"None\0");
  1029.  }
  1030.  
  1031.  return CpuMask;
  1032. }
  1033.  
  1034. LONG CheckGFX (VOID)
  1035. {
  1036. DisplayInfoHandle DisplayHandle;
  1037.  
  1038. struct DisplayInfo DisplayInfo;
  1039.  
  1040. BOOL AGA = FALSE,RTG = FALSE;
  1041.  
  1042. ULONG ModeID = (ULONG) INVALID_ID;
  1043.  
  1044.   if (GetMaxPlanes (LORES_KEY) == MAX_DEPTH) AGA = TRUE;
  1045.  
  1046.   while (((ModeID = NextDisplayInfo (ModeID)) != INVALID_ID) && RTG == FALSE)
  1047.   {
  1048.         DisplayHandle = FindDisplayInfo (ModeID);
  1049.  
  1050.         if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DisplayInfo,sizeof (struct DisplayInfo),DTAG_DISP,ModeID))
  1051.         {
  1052.            if ((DisplayInfo.PropertyFlags & DIPF_IS_FOREIGN) && (GetMaxPlanes (ModeID) >= MAX_DEPTH)) RTG = TRUE;
  1053.         }
  1054.   }
  1055.  
  1056.   if (RTG && AGA) return 3L;
  1057.  
  1058.   if (RTG) return 2L;
  1059.  
  1060.   if (AGA) return 1L;
  1061.  
  1062.   return NULL;
  1063. }
  1064.  
  1065. VOID CloseDisplay (struct ILBMInfo *Ilbm,CPTR *VInfo)
  1066. {
  1067.   if (PMASK & MASK)
  1068.   {
  1069.       FreeVec32 (GfxPpcMem);
  1070.  
  1071.       MASK &= ~PMASK;
  1072.   }
  1073.  
  1074.   if (WMASK & MASK)
  1075.   {
  1076.      ClearMenuStrip (Ilbm->win);
  1077.  
  1078.      PutPointer (Ilbm->win,0,0,0,0,0,CLEAR_POINTER);
  1079.  
  1080.      CloseWindow (Ilbm->win);
  1081.  
  1082.      Ilbm->win = NULL;
  1083.  
  1084.      Ilbm->wrp = NULL;
  1085.  
  1086.      MASK &= ~WMASK;
  1087.   }
  1088.  
  1089.   if (VMASK & MASK)
  1090.   {
  1091.      FreeVisualInfo (VInfo);
  1092.  
  1093.      MASK &= ~VMASK;
  1094.   }
  1095.  
  1096.   if (MMASK & MASK)
  1097.   {
  1098.      FreeBitMapSafety (TempBM);
  1099.  
  1100.      MASK &= ~MMASK;
  1101.   }
  1102.  
  1103.   if (LMASK & MASK)
  1104.   {
  1105.      FreeVec (PixelLine);
  1106.  
  1107.      MASK &= ~LMASK;
  1108.   }
  1109.  
  1110.   if (SMASK & MASK)
  1111.   {
  1112.      CloseScreen (Ilbm->scr);
  1113.  
  1114.      FreeBitMapSafety (Ilbm->brbitmap);
  1115.  
  1116.      Ilbm->scr = NULL;
  1117.  
  1118.      Ilbm->vp  = NULL;
  1119.  
  1120.      Ilbm->srp = NULL;
  1121.  
  1122.      MASK &= ~SMASK;
  1123.   }
  1124.  
  1125.   if (FMASK & MASK)
  1126.   {
  1127.      CloseFont (NEWFONT);
  1128.  
  1129.      MASK &= ~FMASK;
  1130.   }
  1131. }
  1132.  
  1133. BOOL AllocTempRast (struct BitMap *FriendBitMap,UWORD Width,UBYTE Planes)
  1134. {
  1135. BOOL Success = FALSE;
  1136.  
  1137.   if (TempBM = AllocBitMap ((((Width + 15) >> 4) << 1), 1, Planes, BMF_INTERLEAVED | BMF_CLEAR | BMF_MINPLANES, FriendBitMap))
  1138.   {
  1139.      InitRastPort (&TempRP);
  1140.  
  1141.      TempRP.Layer = NULL;
  1142.  
  1143.      TempRP.BitMap = TempBM;
  1144.  
  1145.      if (PixelLine = AllocVec ((((Width + 15) >> 4)  << 4),MEMF_CLEAR | MEMF_PUBLIC)) Success = TRUE;
  1146.  
  1147.      else FreeBitMapSafety (TempBM);
  1148.   }
  1149.  
  1150.   return Success;
  1151. }
  1152.  
  1153. struct Window *OpenDisplay (struct ILBMInfo *Ilbm,WORD Width,WORD Height,WORD Depth,ULONG ModeID)
  1154. {
  1155. struct Screen *Scr;
  1156.  
  1157. struct Window *Win = NULL;
  1158.  
  1159.   if (Scr = OpenIdScreen (Ilbm,Width,Height,Depth,ModeID))
  1160.   {
  1161.      Win = OpenWindowTags (NULL,
  1162.                            WA_Left,Scr->LeftEdge,
  1163.                            WA_Top,Scr->TopEdge,
  1164.                            WA_Width,Scr->Width,
  1165.                            WA_Height,Scr->Height,
  1166.                            WA_ScreenTitle,VERSION "by " AUTHOR " " COPYRIGHT_DATE,
  1167.                            WA_CustomScreen,Scr,
  1168.                            WA_IDCMP,IDCMP_STANDARD,
  1169.                            WA_Flags,WFLG_STANDARD,
  1170.                            WA_MouseQueue,1L,
  1171.                            WA_BusyPointer,TRUE,
  1172.                            TAG_END);
  1173.  
  1174.      if (! Win)
  1175.      {
  1176.         if (Scr) CloseScreen (Scr);
  1177.  
  1178.         return NULL;
  1179.      }
  1180.  
  1181.      Ilbm->scr = Scr;
  1182.  
  1183.      Ilbm->win = Win;
  1184.  
  1185.      Ilbm->vp  = &(Scr->ViewPort);
  1186.  
  1187.      Ilbm->srp = &(Scr->RastPort);
  1188.  
  1189.      Ilbm->wrp = Win->RPort;
  1190.  
  1191.      Ilbm->Bmhd.w = Ilbm->win->Width - Ilbm->win->LeftEdge;
  1192.  
  1193.      Ilbm->Bmhd.h = Ilbm->win->Height - Ilbm->win->TopEdge;
  1194.  
  1195.      Ilbm->Bmhd.nPlanes = Ilbm->wrp->BitMap->Depth;
  1196.   }
  1197.  
  1198.   return (Win);
  1199. }
  1200.  
  1201. struct Screen *OpenIdScreen (struct ILBMInfo *Ilbm,WORD Width,WORD Height,WORD Depth,ULONG ModeID)
  1202. {
  1203. struct Rectangle Spos,DClip,TxtO,StdO,MaxO,UClip;
  1204.  
  1205. struct Rectangle *UClipp;
  1206.  
  1207. struct Screen *Scr;
  1208.  
  1209. LONG ErrorCode = NULL,TryNew;
  1210.  
  1211. ULONG BitMapTag,PassedTags;
  1212.  
  1213.   if (! Ilbm) return (NULL);
  1214.  
  1215.   TryNew = ((QueryOverscan (ModeID,&TxtO,OSCAN_TEXT)) && (QueryOverscan (ModeID,&StdO,OSCAN_STANDARD)) && (QueryOverscan (ModeID,&MaxO,OSCAN_MAX)));
  1216.  
  1217.   if (TryNew)
  1218.   {
  1219.      if (Ilbm->Video) Ilbm->ucliptype = OSCAN_VIDEO;
  1220.  
  1221.      if ((Ilbm->ucliptype) && (QueryOverscan (ModeID,&UClip,(LONG) Ilbm->ucliptype))) UClipp = &UClip;
  1222.  
  1223.      else UClipp = NULL;
  1224.  
  1225.      ClipIt (Width,Height,&Spos,&DClip,&TxtO,&StdO,&MaxO,UClipp,Ilbm->IFFPFlags & IFFPF_NOCENTER ? TRUE : FALSE);
  1226.  
  1227.      BitMapTag = ((Ilbm->brbitmap) && (Ilbm->stype & CUSTOMBITMAP)) ? SA_BitMap : TAG_IGNORE;
  1228.  
  1229.      PassedTags = Ilbm->stags ? TAG_MORE : TAG_IGNORE;
  1230.  
  1231.      Scr = OpenScreenTags (NULL,
  1232.                            SA_DisplayID,   ModeID,
  1233.                            SA_Type,        Ilbm->stype,
  1234.                            SA_Top,         Spos.MinY,
  1235.                            SA_Left,        Spos.MinX,
  1236.                            SA_Width,       Width,
  1237.                            SA_Height,      Height,
  1238.                            SA_Depth,       Depth,
  1239.                            SA_DClip,       &DClip,
  1240.                            SA_AutoScroll,  Ilbm->Autoscroll,
  1241.                            SA_Colors32,    PALETTE,
  1242.                            SA_Pens,        PENS,
  1243.                            SA_Interleaved, TRUE,
  1244.                            SA_Font,        &MYFONTSTRUCT,
  1245.                            SA_Title,       VERSION "by " AUTHOR " " COPYRIGHT_DATE,
  1246.                            SA_ErrorCode,   &ErrorCode,
  1247.                            SA_ShowTitle,   Ilbm->TBState,
  1248.                            BitMapTag,      Ilbm->brbitmap,
  1249.                            PassedTags,     Ilbm->stags,
  1250.                            TAG_END);
  1251.  
  1252.      if (! Scr)
  1253.      {
  1254.         switch (ErrorCode)
  1255.         {
  1256.                  case OSERR_NOMONITOR   : Fail (NoMonitor,20L);
  1257.  
  1258.                                           break;
  1259.  
  1260.                  case OSERR_NOCHIPS     : Fail (NoChips,20L);
  1261.  
  1262.                                           break;
  1263.  
  1264.                  case OSERR_NOMEM       : Fail (NoMem,20L);
  1265.  
  1266.                                           break;
  1267.  
  1268.                  case OSERR_NOCHIPMEM   : Fail (NoChipMem,20L);
  1269.  
  1270.                                           break;
  1271.  
  1272.                  case OSERR_PUBNOTUNIQUE: Fail (PubNotUnique,20L);
  1273.  
  1274.                                           break;
  1275.  
  1276.                  case OSERR_UNKNOWNMODE : Fail (UnknownMode,20L);
  1277.  
  1278.                                           break;
  1279.  
  1280.                  case OSERR_TOODEEP     : Fail (ScreenTooDeep,20L);
  1281.  
  1282.                                           break;
  1283.  
  1284.                  case OSERR_ATTACHFAIL  : Fail (AttachScreen,20L);
  1285.  
  1286.                                           break;
  1287.  
  1288.                  case OSERR_NOTAVAILABLE: Fail (ModeNotAvailableError,20L);
  1289.  
  1290.                                           break;
  1291.  
  1292.                  default                : Fail (UnknownScrError,20L);
  1293.  
  1294.                                           break;
  1295.         }
  1296.  
  1297.         return NULL;
  1298.      }
  1299.   }
  1300.  
  1301.   else return NULL;
  1302.  
  1303.   return (Scr);
  1304. }
  1305.  
  1306. ULONG ModeFallBack (ULONG OldModeID,WORD Width,WORD Height,WORD Depth)
  1307. {
  1308. struct Screen *PubScreen;
  1309.  
  1310. ULONG NewModeID = HIRESLACE_KEY,ModeID;
  1311.  
  1312.   if (PubScreen = LockPubScreen (NULL))
  1313.   {
  1314.      NewModeID = GetVPModeID (&(PubScreen->ViewPort));
  1315.  
  1316.      UnlockPubScreen (NULL,PubScreen);
  1317.   }
  1318.  
  1319.   ModeID = BestModeID (BIDTAG_DIPFMustHave,(OldModeID & EXTRAHALFBRITE_KEY ? DIPF_IS_EXTRAHALFBRITE : 0),
  1320.                        BIDTAG_NominalWidth,Width,
  1321.                        BIDTAG_NominalHeight,Height,
  1322.                        BIDTAG_Depth,Depth,
  1323. /*                       BIDTAG_SourceID,NewModeID, */
  1324.                        TAG_END);
  1325.  
  1326.   if (ModeID != INVALID_ID) NewModeID = ModeID;
  1327.  
  1328.   return (NewModeID);
  1329. }
  1330.  
  1331. VOID ClipIt (WORD wide,WORD high,struct Rectangle *spos,struct Rectangle *dclip,struct Rectangle *txto, struct Rectangle *stdo,struct Rectangle *maxo, struct Rectangle *uclip,BOOL NoCenter)
  1332. {
  1333. struct Rectangle *besto;
  1334.  
  1335. WORD minx, maxx, miny, maxy;
  1336.  
  1337. WORD txtw, txth, stdw, stdh, bestw, besth;
  1338.  
  1339.     /* get the txt, std and max widths and heights */
  1340.  
  1341.     txtw = txto->MaxX - txto->MinX + 1;
  1342.  
  1343.     txth = txto->MaxY - txto->MinY + 1;
  1344.  
  1345.     stdw = stdo->MaxX - stdo->MinX + 1;
  1346.  
  1347.     stdh = stdo->MaxY - stdo->MinY + 1;
  1348.  
  1349.     if ((wide <= txtw) && (high <= txth))
  1350.     {
  1351.         besto = txto;
  1352.  
  1353.         bestw = txtw;
  1354.  
  1355.         besth = txth;
  1356.     }
  1357.  
  1358.     else
  1359.     {
  1360.         besto = stdo;
  1361.  
  1362.         bestw = stdw;
  1363.  
  1364.         besth = stdh;
  1365.     }
  1366.  
  1367.     if (uclip)
  1368.     {
  1369.         *dclip = *uclip;
  1370.  
  1371.         spos->MinX = uclip->MinX;
  1372.  
  1373.         spos->MinY = uclip->MinY;
  1374.     }
  1375.  
  1376.     else
  1377.     {
  1378.         /* CENTER the screen based on best oscan prefs
  1379.         * but confine dclip within max oscan limits
  1380.         *
  1381.         * FIX MinX first */
  1382.  
  1383.         spos->MinX = minx = besto->MinX - ((wide - bestw) >> 1);
  1384.  
  1385.         maxx = wide + minx - 1;
  1386.  
  1387.         if (maxx > maxo->MaxX)  maxx = maxo->MaxX;      /* too right */
  1388.  
  1389.         if (minx < maxo->MinX)
  1390.         {
  1391.             minx = maxo->MinX;  /* too left  */
  1392.  
  1393.             /* if we want left edge of screen not clipped */
  1394.  
  1395.             if (NoCenter) spos->MinX = minx;
  1396.         }
  1397.  
  1398.         /* FIX MinY */
  1399.  
  1400.         spos->MinY = miny = besto->MinY - ((high - besth) >> 1);
  1401.  
  1402.         /* if lower than top of txto, move up */
  1403.  
  1404.         spos->MinY = miny = MIN (spos->MinY,txto->MinY);
  1405.  
  1406.         maxy = high + miny - 1;
  1407.  
  1408.         if (maxy > maxo->MaxY)  maxy = maxo->MaxY;      /* too down  */
  1409.  
  1410.         if (miny < maxo->MinY)
  1411.         {
  1412.            miny = maxo->MinY;   /* too up    */
  1413.  
  1414.            /* if we want top of screen not clipped */
  1415.  
  1416.            if (NoCenter) spos->MinY = miny;
  1417.         }
  1418.  
  1419.         /* SET up dclip */
  1420.  
  1421.         dclip->MinX = minx;
  1422.  
  1423.         dclip->MinY = miny;
  1424.  
  1425.         dclip->MaxX = maxx;
  1426.  
  1427.         dclip->MaxY = maxy;
  1428.     }
  1429. }
  1430.  
  1431. LONG MakeDisplay (struct ILBMInfo *Ilbm)
  1432. {
  1433. static ULONG SAVED_COMPONENT = NULL,SAVED_POSITION = NULL;
  1434.  
  1435.   if (Ilbm->IFFPFlags & IFFPF_USERMODE) Ilbm->camg = Ilbm->usermodeid;
  1436.  
  1437.   Ilbm->Bmhd.w = MAX (MIN_WIDTH,Ilbm->Bmhd.w);
  1438.  
  1439.   Ilbm->Bmhd.h = MAX (MIN_HEIGHT,Ilbm->Bmhd.h);
  1440.  
  1441.   if (ModeNotAvailable (Ilbm->camg) || (Ilbm->IFFPFlags & IFFPF_BESTFIT))
  1442.  
  1443.      Ilbm->camg = ModeFallBack (Ilbm->camg,Ilbm->Bmhd.w,Ilbm->Bmhd.h,Ilbm->Bmhd.nPlanes);
  1444.  
  1445.   Ilbm->Bmhd.nPlanes = MAX (MIN_DEPTH,Ilbm->Bmhd.nPlanes);
  1446.  
  1447.   if (Ilbm->Bmhd.nPlanes > GetMaxPlanes (Ilbm->camg)) Ilbm->Bmhd.nPlanes = GetMaxPlanes (Ilbm->camg);
  1448.  
  1449.   if (NEWFONT = OpenDiskFont (&MYFONTSTRUCT)) MASK |= FMASK;
  1450.  
  1451.   else
  1452.   {
  1453.      strcpy (MYFONTSTRUCT.ta_Name,DEF_FONTNAMESTR);
  1454.  
  1455.      MYFONTSTRUCT.ta_YSize = DEF_FONTSIZE;
  1456.  
  1457.      MYFONTSTRUCT.ta_Style = FS_NORMAL;
  1458.  
  1459.      MYFONTSTRUCT.ta_Flags = FPF_ROMFONT;
  1460.  
  1461.      if (NEWFONT = OpenFont (&MYFONTSTRUCT)) MASK |= FMASK;
  1462.  
  1463.      else
  1464.      {
  1465.        Fail (FontError,20L);
  1466.  
  1467.        return NULL;
  1468.      }
  1469.   }
  1470.  
  1471.   PALETTE [0L] = ((ULONG) (1L << Ilbm->Bmhd.nPlanes) << 16);
  1472.  
  1473.   if (SAVED_POSITION) PALETTE [SAVED_POSITION] = SAVED_COMPONENT;
  1474.  
  1475.   SAVED_POSITION = 3L * (1L << Ilbm->Bmhd.nPlanes) + 1;
  1476.  
  1477.   SAVED_COMPONENT = PALETTE [SAVED_POSITION];
  1478.  
  1479.   PALETTE [SAVED_POSITION] = NULL;
  1480.  
  1481.   if (! (OpenDisplay (Ilbm,MAX (Ilbm->Bmhd.pageWidth,Ilbm->Bmhd.w),MAX (Ilbm->Bmhd.pageHeight,Ilbm->Bmhd.h),Ilbm->Bmhd.nPlanes,Ilbm->camg))) return NULL;
  1482.  
  1483.   MASK |= SMASK;
  1484.  
  1485.   MASK |= WMASK;
  1486.  
  1487.   if (! (AllocTempRast (Ilbm->wrp->BitMap,Ilbm->Bmhd.w,Ilbm->Bmhd.nPlanes)))
  1488.   {
  1489.      Fail (NoMemForTempRastPort,20L);
  1490.  
  1491.      return (NULL);
  1492.   }
  1493.  
  1494.   MASK |= MMASK;
  1495.  
  1496.   MASK |= LMASK;
  1497.  
  1498.   if (! (VINFO = GetVisualInfo (Ilbm->scr,TAG_END)))
  1499.   {
  1500.      Fail (VisualInfoError,20L);
  1501.  
  1502.      return NULL;
  1503.   }
  1504.  
  1505.   MASK |= VMASK;
  1506.  
  1507.   if (! (LayoutMenus (MAINMENU,VINFO,GTMN_TextAttr,&MYFONTSTRUCT,GTMN_NewLookMenus,TRUE,TAG_END)))
  1508.   {
  1509.      Fail (FontError,20L);
  1510.  
  1511.      return NULL;
  1512.   }
  1513.  
  1514.   if (CPUINFO & (CPU_603|CPU_603e|CPU_604|CPU_604e|CPU_620))
  1515.   {
  1516.      if (GfxPpcMem = AllocVec32 (((((Ilbm->Bmhd.w+15) >> 4) << 4) * (Ilbm->Bmhd.h+1)), MEMF_PUBLIC)) MASK |= PMASK;
  1517.  
  1518.      else
  1519.      {
  1520.         ItemAddress (MAINMENU,FULLMENUNUM (1,6,NOSUB))->Flags |= NM_ITEMDISABLED;
  1521.  
  1522.         MANDChunk.Flags |= MC68K_BIT;
  1523.  
  1524.         MANDChunk.Flags &= ~PPC_BIT;
  1525.      }
  1526.   }
  1527.  
  1528.   SetMenuStrip (Ilbm->win,MAINMENU);
  1529.  
  1530.   Ilbm->EHB = FALSE;
  1531.  
  1532.   return (1L << Ilbm->Bmhd.nPlanes);
  1533. }
  1534.  
  1535. VOID ShowTime (struct Window *Win,TEXT *String,ULONG Secs)
  1536. {
  1537.   if (Secs)
  1538.  
  1539.      sprintf (BAR_STRING,"%s %uh %um %us - Average speed: %.1f Pixels per second",String,Secs / 3600L,(Secs / 60L) % 60L,Secs % 60L,(LDouble) ((Win->Width - Win->BorderLeft - Win->BorderRight) * (Win->Height - Win->BorderTop - Win->BorderBottom)) / Secs);
  1540.  
  1541.   else
  1542.  
  1543.      sprintf (BAR_STRING,"%s Less than one second - Average speed: Realtime",String);
  1544.  
  1545.   SetWindowTitles (Win,(TEXT *) ~0,BAR_STRING);
  1546. }
  1547.  
  1548. void SaveCoords (struct Window *Win,BOOL ShowMenu)
  1549. {
  1550.   URMIN = RMIN;
  1551.  
  1552.   URMAX = RMAX;
  1553.  
  1554.   UIMIN = IMIN;
  1555.  
  1556.   UIMAX = IMAX;
  1557.  
  1558.   UJKRE = JKRE;
  1559.  
  1560.   UJKIM = JKIM;
  1561.  
  1562.   UITERATIONS = MAX_ITERATIONS;
  1563.  
  1564.   UFLAGS = MANDChunk.Flags;
  1565.  
  1566.   if (ShowMenu) OnMenu (Win,FULLMENUNUM (2,4,NOSUB));
  1567. }
  1568.  
  1569. void RestoreCoords (struct Window *Win)
  1570. {
  1571.   RMIN = URMIN;
  1572.  
  1573.   RMAX = URMAX;
  1574.  
  1575.   IMIN = UIMIN;
  1576.  
  1577.   IMAX = UIMAX;
  1578.  
  1579.   JKRE = UJKRE;
  1580.  
  1581.   JKIM = UJKIM;
  1582.  
  1583.   MAX_ITERATIONS = UITERATIONS;
  1584.  
  1585.   MANDChunk.Flags = UFLAGS;
  1586.  
  1587.   CheckMenu (Win);
  1588.  
  1589.   OffMenu (Win,FULLMENUNUM (2,4,NOSUB));
  1590. }
  1591.  
  1592. BOOL NewCoords (struct Window *Win,const WORD a1,const WORD b1,const WORD a2,const WORD b2)
  1593. {
  1594. LDouble KReal,KImag;
  1595.  
  1596.   if (((a2 - a1) < 2L) || ((b2 - b1) < 2L)) return FALSE;
  1597.  
  1598.   KReal = fabs (RMAX-RMIN) / ((LDouble) Win->Width);
  1599.  
  1600.   KImag = fabs (IMAX-IMIN) / ((LDouble) Win->Height);
  1601.  
  1602.   SaveCoords (Win,TRUE);
  1603.  
  1604.   RMAX = RMIN + ((LDouble) a2 * KReal);
  1605.  
  1606.   IMIN = IMAX - ((LDouble) b2 * KImag);
  1607.  
  1608.   RMIN += ((LDouble) a1 * KReal);
  1609.  
  1610.   IMAX -= ((LDouble) b1 * KImag);
  1611.  
  1612.   return TRUE;
  1613. }
  1614.  
  1615. void AdjustRatio (LDouble *RMin,LDouble *IMax,LDouble *RMax,LDouble *IMin,WORD ScrWidth,WORD ScrHeight,BOOL KeepReal)
  1616. {
  1617. LDouble RWidth,IHeight,RCenter,ICenter;
  1618.  
  1619.   IHeight = *IMax - *IMin;
  1620.  
  1621.   RWidth  = *RMax - *RMin;
  1622.  
  1623.   if (KeepReal)
  1624.   {
  1625.      ICenter = *IMin + (IHeight / 2.0);
  1626.  
  1627.      IHeight = (RWidth * ScrHeight) / ScrWidth;
  1628.  
  1629.      *IMax = ICenter + (IHeight / 2.0);
  1630.  
  1631.      *IMin = ICenter - (IHeight / 2.0);
  1632.   }
  1633.  
  1634.   else
  1635.   {
  1636.      RCenter = *RMin + (RWidth / 2.0);
  1637.  
  1638.      RWidth = (IHeight * ScrWidth) / ScrHeight;
  1639.  
  1640.      *RMax = RCenter + (RWidth / 2.0);
  1641.  
  1642.      *RMin = RCenter - (RWidth / 2.0);
  1643.   }
  1644. }
  1645.  
  1646. void SystemInfo (struct Window *Win)
  1647. {
  1648. static struct EasyStruct MyReq = { sizeof (struct EasyStruct),0,"System info requester","Cpu informations\n\nMc68K\nCpu:%s Fpu:%s\n\nPowerPc\nCpu:%s  Fpu:%s\n\n\nMemory informations\n\nAvailable\nChip:%ld  Fast:%ld\n\nLargest free\nChip:%ld  Fast:%ld\n","Ok" };
  1649.  
  1650.   EasyRequest (Win,&MyReq,NULL,CPU68K_STR,FPU68K_STR,CPUPPC_STR,FPUPPC_STR,AvailMem (MEMF_CHIP),AvailMem (MEMF_FAST),AvailMem (MEMF_CHIP|MEMF_LARGEST),AvailMem (MEMF_FAST|MEMF_LARGEST));
  1651. }
  1652.  
  1653.  
  1654. LONG About (struct Window *Win)
  1655. {
  1656. static struct EasyStruct MyReq_1 = { sizeof (struct EasyStruct),0,"Informations requester","%s  %s \n\n\n  Snail address: \n  %s\n  %s\n\n\n  %s\n\n*******************************\n* This program is GiftWare !! *\n*******************************\n\n","Ok|More..." };
  1657.  
  1658. static struct EasyStruct MyReq_2 = { sizeof (struct EasyStruct),0,"Workgroup","Greetings & thanks to:\n\n  Edgar Schwan\n  Giorgio Signori\n\n\nIf someone hasn't the courage to risk\nfor his ideals, either his ideals are\nworth nothing, or worth nothing is he\n\nAmiga forever.\n\n","Ok" };
  1659.  
  1660. LONG More;
  1661.  
  1662.   More = EasyRequest (Win,&MyReq_1,NULL,VERSION,COPYRIGHT_DATE,AUTHOR,ADDRESS,EMAIL);
  1663.  
  1664.   if (! More) EasyRequest (Win,&MyReq_2,NULL);
  1665.  
  1666.   return More;
  1667. }
  1668.  
  1669. ULONG Fail (UBYTE *ErrorString,ULONG ErrorLevel)
  1670. {
  1671.   DisplayBeep (NULL);
  1672.  
  1673.   fputs (ErrorString,stdout);
  1674.  
  1675.   RETURNVALUE = ErrorLevel;
  1676.  
  1677.   return ErrorLevel;
  1678. }
  1679.  
  1680. LONG Choice (struct Window *Win,TEXT *Title,TEXT *String)
  1681. {
  1682. struct EasyStruct MyReq = { sizeof (struct EasyStruct),NULL,0,0,"Yes|No" };
  1683.  
  1684.   MyReq.es_Title = Title;
  1685.  
  1686.   MyReq.es_TextFormat = String;
  1687.  
  1688.   return EasyRequest (Win,&MyReq,0);
  1689. }
  1690.  
  1691. BOOL ShowCoords (struct Window *Win)
  1692. {
  1693. struct Gadget *GadList = NULL,*StringGad_1,*StringGad_2,*StringGad_3,*StringGad_4,*StringGad_5,*StringGad_6;
  1694.  
  1695. struct Gadget *MyButtonGad,*MyCheckBoxGad,*MyGad;
  1696.  
  1697. struct Window *GadWin;
  1698.  
  1699. struct IntuiMessage *Message;
  1700.  
  1701. BOOL End = FALSE,Accept = FALSE,Reset = FALSE,Ratio = FALSE,KeepReal = TRUE;
  1702.  
  1703. TEXT String [MAXCHARS];
  1704.  
  1705. UWORD MyCode;
  1706.  
  1707. ULONG MyClass;
  1708.  
  1709. LDouble Tmp_RMIN = RMIN,Tmp_IMAX = IMAX,Tmp_RMAX = RMAX,Tmp_IMIN = IMIN,Tmp_JKRE,Tmp_JKIM;
  1710.  
  1711.   TEXTGAD.ng_VisualInfo = BUTTONGAD.ng_VisualInfo = CHECKBOXGAD.ng_VisualInfo  = VINFO;
  1712.  
  1713.   StringGad_1 = CreateContext (&GadList);
  1714.  
  1715.   TEXTGAD.ng_LeftEdge     = 118;
  1716.  
  1717.   TEXTGAD.ng_TopEdge      = 20;
  1718.  
  1719.   TEXTGAD.ng_Width        = 194;
  1720.  
  1721.   TEXTGAD.ng_Height       = (MYFONTSTRUCT.ta_YSize * 3L) >> 1;
  1722.  
  1723.   TEXTGAD.ng_GadgetText   = "_Left";
  1724.  
  1725.   TEXTGAD.ng_Flags        = PLACETEXT_LEFT;
  1726.  
  1727.   sprintf (String,"%+2.16f",RMIN);
  1728.  
  1729.   StringGad_1 = CreateGadget (STRING_KIND,StringGad_1,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1730.  
  1731.   TEXTGAD.ng_TopEdge     += (14 + TEXTGAD.ng_Height);
  1732.  
  1733.   TEXTGAD.ng_GadgetText   = "_Top ";
  1734.  
  1735.   sprintf (String,"%+2.16f",IMAX);
  1736.  
  1737.   StringGad_2 = CreateGadget (STRING_KIND,StringGad_1,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1738.  
  1739.   TEXTGAD.ng_TopEdge     += (14 + TEXTGAD.ng_Height);
  1740.  
  1741.   TEXTGAD.ng_GadgetText   = "_Right";
  1742.  
  1743.   TEXTGAD.ng_Flags        = PLACETEXT_RIGHT;
  1744.  
  1745.   sprintf (String,"%+2.16f",RMAX);
  1746.  
  1747.   StringGad_3 = CreateGadget (STRING_KIND,StringGad_2,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1748.  
  1749.   TEXTGAD.ng_TopEdge     += (14 + TEXTGAD.ng_Height);
  1750.  
  1751.   TEXTGAD.ng_GadgetText   = "_Bottom";
  1752.  
  1753.   sprintf (String,"%+2.16f",IMIN);
  1754.  
  1755.   StringGad_4 = CreateGadget (STRING_KIND,StringGad_3,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1756.  
  1757.   TEXTGAD.ng_TopEdge     += (24 + TEXTGAD.ng_Height);
  1758.  
  1759.   TEXTGAD.ng_GadgetText   = "_Julia real";
  1760.  
  1761.   TEXTGAD.ng_Flags        = PLACETEXT_LEFT;
  1762.  
  1763.   sprintf (String,"%+2.16f",JKRE);
  1764.  
  1765.   StringGad_5 = CreateGadget (STRING_KIND,StringGad_4,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1766.  
  1767.   TEXTGAD.ng_TopEdge     += (14 + TEXTGAD.ng_Height);
  1768.  
  1769.   TEXTGAD.ng_GadgetText   = "J_ulia imag";
  1770.  
  1771.   sprintf (String,"%+2.16f",JKIM);
  1772.  
  1773.   StringGad_6 = CreateGadget (STRING_KIND,StringGad_5,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1774.  
  1775.   CHECKBOXGAD.ng_LeftEdge   = 14;
  1776.  
  1777.   CHECKBOXGAD.ng_TopEdge    = TEXTGAD.ng_TopEdge + TEXTGAD.ng_Height + 24;
  1778.  
  1779.   CHECKBOXGAD.ng_Width      = MYFONTSTRUCT.ta_YSize << 1L;
  1780.  
  1781.   CHECKBOXGAD.ng_Height     = MYFONTSTRUCT.ta_YSize + 6;
  1782.  
  1783.   CHECKBOXGAD.ng_GadgetText = "_Keep X axis for ratio";
  1784.  
  1785.   CHECKBOXGAD.ng_Flags      = PLACETEXT_RIGHT;
  1786.  
  1787.   CHECKBOXGAD.ng_GadgetID   = KEEP;
  1788.  
  1789.   MyCheckBoxGad = CreateGadget (CHECKBOX_KIND,StringGad_6,&CHECKBOXGAD,GTCB_Checked,TRUE,GTCB_Scaled,TRUE,GT_Underscore,'_',TAG_END);
  1790.  
  1791.   BUTTONGAD.ng_LeftEdge   = 14;
  1792.  
  1793.   BUTTONGAD.ng_TopEdge    = CHECKBOXGAD.ng_TopEdge + CHECKBOXGAD.ng_Height + 30;
  1794.  
  1795.   BUTTONGAD.ng_Width      = 90;
  1796.  
  1797.   BUTTONGAD.ng_Height     = (MYFONTSTRUCT.ta_YSize * 3L) >> 1L;
  1798.  
  1799.   BUTTONGAD.ng_GadgetText = "_Accept";
  1800.  
  1801.   BUTTONGAD.ng_GadgetID   = ACCEPT;
  1802.  
  1803.   MyButtonGad = CreateGadget (BUTTON_KIND,MyCheckBoxGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1804.  
  1805.   BUTTONGAD.ng_LeftEdge  += (14 + BUTTONGAD.ng_Width);
  1806.  
  1807.   BUTTONGAD.ng_GadgetText = "Rat_io";
  1808.  
  1809.   BUTTONGAD.ng_GadgetID   = RATIO;
  1810.  
  1811.   MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1812.  
  1813.   BUTTONGAD.ng_LeftEdge  += (14 + BUTTONGAD.ng_Width);
  1814.  
  1815.   BUTTONGAD.ng_GadgetText = "_Default";
  1816.  
  1817.   BUTTONGAD.ng_GadgetID   = RESET;
  1818.  
  1819.   MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1820.  
  1821.   BUTTONGAD.ng_LeftEdge  += (14 + BUTTONGAD.ng_Width);
  1822.  
  1823.   BUTTONGAD.ng_GadgetText = "_Cancel";
  1824.  
  1825.   BUTTONGAD.ng_GadgetID   = CANCEL;
  1826.  
  1827.   MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1828.  
  1829.   if (MyButtonGad)
  1830.   {
  1831.      GadWin = OpenWindowTags (NULL,WA_Left,Win->LeftEdge + 25,
  1832.                                    WA_Top,Win->TopEdge + 35,
  1833.                                    WA_Width,BUTTONGAD.ng_LeftEdge + BUTTONGAD.ng_Width + 24,
  1834.                                    WA_Height,BUTTONGAD.ng_TopEdge + BUTTONGAD.ng_Height + 35,
  1835.                                    WA_Title,"Coordinates requester",
  1836.                                    WA_ScreenTitle,"Insert new range...",
  1837.                                    WA_CustomScreen,Win->WScreen,
  1838.                                    WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY|STRINGIDCMP|BUTTONIDCMP,
  1839.                                    WA_Flags,WFLG_ACTIVATE|WFLG_DRAGBAR|WFLG_SIMPLE_REFRESH|WFLG_GIMMEZEROZERO|WFLG_RMBTRAP,
  1840.                                    WA_Gadgets,GadList,
  1841.                                    TAG_END);
  1842.      if (GadWin)
  1843.      {
  1844.         GT_RefreshWindow (GadWin,NULL);
  1845.  
  1846.         do {  WaitPort (GadWin->UserPort);
  1847.  
  1848.               if (Message = (struct IntuiMessage *) GT_GetIMsg (GadWin->UserPort))
  1849.               {
  1850.                      MyGad = (struct Gadget *) Message->IAddress;
  1851.  
  1852.                      MyClass = Message->Class;
  1853.  
  1854.                      MyCode = Message->Code;
  1855.  
  1856.                      GT_ReplyIMsg ((struct IntuiMessage *) Message);
  1857.  
  1858.                      switch (MyClass)
  1859.                      {
  1860.                             case IDCMP_REFRESHWINDOW : GT_BeginRefresh (GadWin);
  1861.  
  1862.                                                        GT_EndRefresh (GadWin,TRUE);
  1863.  
  1864.                                                        break;
  1865.  
  1866.                             case IDCMP_VANILLAKEY    : switch (ToUpper ((ULONG) MyCode))
  1867.                                                        {
  1868.                                                               case 'L' : ActivateGadget (StringGad_1,GadWin,0);
  1869.  
  1870.                                                                          break;
  1871.  
  1872.                                                               case 'T' : ActivateGadget (StringGad_2,GadWin,0);
  1873.  
  1874.                                                                          break;
  1875.  
  1876.                                                               case 'R' : ActivateGadget (StringGad_3,GadWin,0);
  1877.  
  1878.                                                                          break;
  1879.  
  1880.                                                               case 'B' : ActivateGadget (StringGad_4,GadWin,0);
  1881.  
  1882.                                                                          break;
  1883.  
  1884.                                                               case 'J' : ActivateGadget (StringGad_5,GadWin,0);
  1885.  
  1886.                                                                          break;
  1887.  
  1888.                                                               case 'U' : ActivateGadget (StringGad_6,GadWin,0);
  1889.  
  1890.                                                                          break;
  1891.  
  1892.                                                               case 'A' : Accept = TRUE;
  1893.  
  1894.                                                                          break;
  1895.  
  1896.                                                               case 'I' : Ratio = TRUE;
  1897.  
  1898.                                                                          break;
  1899.  
  1900.                                                               case 'D' : Reset = TRUE;
  1901.  
  1902.                                                                          break;
  1903.  
  1904.                                                               case 'C' : End = TRUE;
  1905.  
  1906.                                                                          break;
  1907.  
  1908.                                                               case 'K' : KeepReal = ! KeepReal;
  1909.  
  1910.                                                                          GT_SetGadgetAttrs (MyCheckBoxGad,GadWin,NULL,GTCB_Checked,KeepReal,TAG_END);
  1911.  
  1912.                                                                          break;
  1913.  
  1914.                                                            case VAN_ESC: End = TRUE;
  1915.                                                        }
  1916.  
  1917.                                                                break;
  1918.  
  1919.                             case IDCMP_GADGETUP      : switch (MyGad->GadgetID)
  1920.                                                        {
  1921.                                                               case ACCEPT:   Accept = TRUE;
  1922.  
  1923.                                                                              break;
  1924.  
  1925.                                                               case  RATIO:   Ratio = TRUE;
  1926.  
  1927.                                                                              break;
  1928.  
  1929.                                                               case  RESET:   Reset = TRUE;
  1930.  
  1931.                                                                              break;
  1932.  
  1933.                                                               case   KEEP:   KeepReal = ! KeepReal;
  1934.  
  1935.                                                                              break;
  1936.  
  1937.                                                               case CANCEL:   End = TRUE;
  1938.                                                        }
  1939.  
  1940.                                                        break;
  1941.  
  1942.                             case IDCMP_CLOSEWINDOW   : End = TRUE;
  1943.                      }
  1944.  
  1945.                      if (Accept)
  1946.                      {
  1947.  
  1948.                         Tmp_RMIN = strtod (((struct StringInfo *) StringGad_1->SpecialInfo)->Buffer,NULL);
  1949.  
  1950.                         Tmp_IMAX = strtod (((struct StringInfo *) StringGad_2->SpecialInfo)->Buffer,NULL);
  1951.  
  1952.                         Tmp_RMAX = strtod (((struct StringInfo *) StringGad_3->SpecialInfo)->Buffer,NULL);
  1953.  
  1954.                         Tmp_IMIN = strtod (((struct StringInfo *) StringGad_4->SpecialInfo)->Buffer,NULL);
  1955.  
  1956.                         Tmp_JKRE = strtod (((struct StringInfo *) StringGad_5->SpecialInfo)->Buffer,NULL);
  1957.  
  1958.                         Tmp_JKIM = strtod (((struct StringInfo *) StringGad_6->SpecialInfo)->Buffer,NULL);
  1959.  
  1960.                         if ((Tmp_RMIN >= Tmp_RMAX) || (Tmp_IMIN >= Tmp_IMAX))
  1961.  
  1962.                            DisplayBeep (Win->WScreen);
  1963.  
  1964.                         else
  1965.                         {
  1966.                            SaveCoords (Win,FALSE);
  1967.  
  1968.                            RMIN = Tmp_RMIN; IMAX = Tmp_IMAX; RMAX = Tmp_RMAX; IMIN = Tmp_IMIN; JKRE = Tmp_JKRE; JKIM = Tmp_JKIM;
  1969.  
  1970.                            End = TRUE;
  1971.                         }
  1972.                      }
  1973.  
  1974.                      if (Ratio)
  1975.                      {
  1976.                         AdjustRatio (&Tmp_RMIN,&Tmp_IMAX,&Tmp_RMAX,&Tmp_IMIN,Win->Width,Win->Height,KeepReal);
  1977.  
  1978.                         TEXTGAD.ng_Flags = PLACETEXT_LEFT;
  1979.  
  1980.                         sprintf (String,"%+2.16f",Tmp_RMIN);
  1981.  
  1982.                         GT_SetGadgetAttrs (StringGad_1,GadWin,NULL,GTST_String,String,TAG_END);
  1983.  
  1984.                         sprintf (String,"%+2.16f",Tmp_IMAX);
  1985.  
  1986.                         GT_SetGadgetAttrs (StringGad_2,GadWin,NULL,GTST_String,String,TAG_END);
  1987.  
  1988.                         sprintf (String,"%+2.16f",Tmp_RMAX);
  1989.  
  1990.                         TEXTGAD.ng_Flags = PLACETEXT_RIGHT;
  1991.  
  1992.                         GT_SetGadgetAttrs (StringGad_3,GadWin,NULL,GTST_String,String,TAG_END);
  1993.  
  1994.                         sprintf (String,"%+2.16f",Tmp_IMIN);
  1995.  
  1996.                         GT_SetGadgetAttrs (StringGad_4,GadWin,NULL,GTST_String,String,TAG_END);
  1997.  
  1998.                         Ratio = FALSE;
  1999.                      }
  2000.  
  2001.                      if (Reset)
  2002.                      {
  2003.                         TEXTGAD.ng_Flags = PLACETEXT_LEFT;
  2004.  
  2005.                         sprintf (String,"%+2.16f",DEF_RMIN);
  2006.  
  2007.                         GT_SetGadgetAttrs (StringGad_1,GadWin,NULL,GTST_String,String,TAG_END);
  2008.  
  2009.                         sprintf (String,"%+2.16f",DEF_IMAX);
  2010.  
  2011.                         GT_SetGadgetAttrs (StringGad_2,GadWin,NULL,GTST_String,String,TAG_END);
  2012.  
  2013.                         TEXTGAD.ng_Flags = PLACETEXT_RIGHT;
  2014.  
  2015.                         sprintf (String,"%+2.16f",DEF_RMAX);
  2016.  
  2017.                         GT_SetGadgetAttrs (StringGad_3,GadWin,NULL,GTST_String,String,TAG_END);
  2018.  
  2019.                         sprintf (String,"%+2.16f",DEF_IMIN);
  2020.  
  2021.                         GT_SetGadgetAttrs (StringGad_4,GadWin,NULL,GTST_String,String,TAG_END);
  2022.  
  2023.                         sprintf (String,"%+2.16f",DEF_JKRE);
  2024.  
  2025.                         GT_SetGadgetAttrs (StringGad_5,GadWin,NULL,GTST_String,String,TAG_END);
  2026.  
  2027.                         sprintf (String,"%+2.16f",DEF_JKIM);
  2028.  
  2029.                         GT_SetGadgetAttrs (StringGad_6,GadWin,NULL,GTST_String,String,TAG_END);
  2030.  
  2031.                         Reset = FALSE;
  2032.                      }
  2033.               }
  2034.  
  2035.            } while (End == FALSE);
  2036.  
  2037.        CloseWindow (GadWin);
  2038.      }
  2039.  
  2040.      else Fail (WindowGadgetError,15L);
  2041.   }
  2042.  
  2043.   else Fail (GadgetError,15L);
  2044.  
  2045.   FreeGadgets (GadList);
  2046.  
  2047.   return Accept;
  2048. }
  2049.  
  2050. ULONG IntegerGad (struct Window *Win,TEXT *TitleWin,TEXT *TitleScr,TEXT *TxtString,ULONG Var)
  2051. {
  2052. struct IntuiMessage *Message;
  2053.  
  2054. struct Gadget *GadList = NULL,*MyIntGad,*MyButtonGad,*MyGad;
  2055.  
  2056. struct Window *GadWin;
  2057.  
  2058. BOOL End = FALSE;
  2059.  
  2060. UWORD MyCode;
  2061.  
  2062. ULONG MyClass,ReturnValue = Var;
  2063.  
  2064.   TEXTGAD.ng_VisualInfo = BUTTONGAD.ng_VisualInfo = VINFO;
  2065.  
  2066.   MyIntGad = CreateContext (&GadList);
  2067.  
  2068.   TEXTGAD.ng_LeftEdge     = 170;
  2069.  
  2070.   TEXTGAD.ng_TopEdge      = 20;
  2071.  
  2072.   TEXTGAD.ng_Width        = 90;
  2073.  
  2074.   TEXTGAD.ng_Height       = (MYFONTSTRUCT.ta_YSize * 3L) >> 1L;
  2075.  
  2076.   TEXTGAD.ng_GadgetText   = TxtString;
  2077.  
  2078.   TEXTGAD.ng_Flags        = PLACETEXT_LEFT;
  2079.  
  2080.   MyIntGad = CreateGadget (INTEGER_KIND,MyIntGad,&TEXTGAD,GTIN_Number,Var,GTIN_MaxChars,6,STRINGA_ReplaceMode,TRUE,GT_Underscore,'_',TAG_END);
  2081.  
  2082.   BUTTONGAD.ng_LeftEdge   = 20;
  2083.  
  2084.   BUTTONGAD.ng_TopEdge    = TEXTGAD.ng_TopEdge + TEXTGAD.ng_Height + 30;
  2085.  
  2086.   BUTTONGAD.ng_Width      = 90;
  2087.  
  2088.   BUTTONGAD.ng_Height     = (MYFONTSTRUCT.ta_YSize * 3L) >> 1L;
  2089.  
  2090.   BUTTONGAD.ng_GadgetText = "_Accept";
  2091.  
  2092.   BUTTONGAD.ng_GadgetID   = ACCEPT;
  2093.  
  2094.   MyButtonGad = CreateGadget (BUTTON_KIND,MyIntGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  2095.  
  2096.   BUTTONGAD.ng_LeftEdge  += (60 + BUTTONGAD.ng_Width);
  2097.  
  2098.   BUTTONGAD.ng_GadgetText = "_Cancel";
  2099.  
  2100.   BUTTONGAD.ng_GadgetID   = CANCEL;
  2101.  
  2102.   MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  2103.  
  2104.   if (MyButtonGad)
  2105.   {
  2106.      GadWin = OpenWindowTags (NULL,WA_Left,Win->LeftEdge + 25,
  2107.                                    WA_Top,Win->TopEdge + 35,
  2108.                                    WA_Width,BUTTONGAD.ng_LeftEdge + BUTTONGAD.ng_Width + 30,
  2109.                                    WA_Height,BUTTONGAD.ng_TopEdge + BUTTONGAD.ng_Height + 35,
  2110.                                    WA_Title,TitleWin,
  2111.                                    WA_ScreenTitle,TitleScr,
  2112.                                    WA_CustomScreen,Win->WScreen,
  2113.                                    WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY|INTEGERIDCMP|BUTTONIDCMP,
  2114.                                    WA_Flags,WFLG_ACTIVATE|WFLG_DRAGBAR|WFLG_SIMPLE_REFRESH|WFLG_GIMMEZEROZERO|WFLG_RMBTRAP,
  2115.                                    WA_Gadgets,GadList,
  2116.                                    TAG_END);
  2117.  
  2118.      if (GadWin)
  2119.      {
  2120.         GT_RefreshWindow (GadWin,NULL);
  2121.  
  2122.         do {  WaitPort (GadWin->UserPort);
  2123.  
  2124.               if (Message = (struct IntuiMessage *) GT_GetIMsg (GadWin->UserPort))
  2125.               {
  2126.                      MyGad = (struct Gadget *) Message->IAddress;
  2127.  
  2128.                      MyClass = Message->Class;
  2129.  
  2130.                      MyCode = Message->Code;
  2131.  
  2132.                      GT_ReplyIMsg ((struct IntuiMessage *) Message);
  2133.  
  2134.                      switch (MyClass)
  2135.                      {
  2136.                             case IDCMP_REFRESHWINDOW : GT_BeginRefresh (GadWin);
  2137.  
  2138.                                                        GT_EndRefresh (GadWin,TRUE);
  2139.  
  2140.                                                        break;
  2141.  
  2142.                             case IDCMP_VANILLAKEY    : switch (ToUpper ((ULONG) MyCode))
  2143.                                                        {
  2144.                                                               case 'D' :
  2145.  
  2146.                                                               case 'I' : ActivateGadget (MyIntGad,GadWin,0);
  2147.  
  2148.                                                                          break;
  2149.  
  2150.                                                               case 'A' : ReturnValue = ((struct StringInfo *) MyIntGad->SpecialInfo)->LongInt;
  2151.  
  2152.                                                                          End = TRUE;
  2153.  
  2154.                                                                          break;
  2155.  
  2156.                                                               case 'C' : End = TRUE;
  2157.  
  2158.                                                                          break;
  2159.  
  2160.                                                            case VAN_ESC: End = TRUE;
  2161.                                                        }
  2162.  
  2163.                                                        break;
  2164.  
  2165.                             case IDCMP_GADGETUP      : switch (MyGad->GadgetID)
  2166.                                                        {
  2167.                                                                case ACCEPT  : ReturnValue = ((struct StringInfo *) MyIntGad->SpecialInfo)->LongInt;
  2168.  
  2169.                                                                               End = TRUE;
  2170.  
  2171.                                                                               break;
  2172.  
  2173.                                                                case CANCEL  : End = TRUE;
  2174.                                                        }
  2175.  
  2176.                                                        break;
  2177.  
  2178.                             case IDCMP_CLOSEWINDOW   : End = TRUE;
  2179.                      }
  2180.               }
  2181.  
  2182.            } while (End == FALSE);
  2183.  
  2184.         CloseWindow (GadWin);
  2185.      }
  2186.  
  2187.      else Fail (WindowError,15L);
  2188.   }
  2189.  
  2190.   else Fail (GadgetError,15L);
  2191.  
  2192.   FreeGadgets (GadList);
  2193.  
  2194.   return ReturnValue;
  2195. }
  2196.  
  2197. UBYTE LinearRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations)
  2198. {
  2199.   return ((UBYTE) floor ((Iterations * MaxColors) / MaxIterations));
  2200. }
  2201.  
  2202. UBYTE LogRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations)
  2203. {
  2204.   return ((UBYTE) floor ((log (Iterations) * MaxColors) / log (MaxIterations)));
  2205. }
  2206.  
  2207. UBYTE RepeatedRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations)
  2208. {
  2209.   return ((UBYTE) ceil (MaxColors - fmod (MaxIterations - Iterations,MaxColors) - 1.0));
  2210. }
  2211.  
  2212. UBYTE SquareRootRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations)
  2213. {
  2214.   return ((UBYTE) floor ((sqrt (Iterations) * MaxColors) / sqrt (MaxIterations)));
  2215. }
  2216.  
  2217. UBYTE OneRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations)
  2218. {
  2219.   return ((UBYTE) floor (((Iterations * Iterations - Iterations) * MaxColors) / (MaxIterations * MaxIterations - MaxIterations)));
  2220. }
  2221.  
  2222. UBYTE TwoRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations)
  2223. {
  2224.   return ((UBYTE) floor ((sqrt (pow (Iterations,3.0) - Iterations * Iterations - Iterations) * MaxColors) / sqrt (pow (MaxIterations,3.0) - MaxIterations * MaxIterations - MaxIterations)));
  2225. }
  2226.  
  2227. UBYTE ThreeRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations)
  2228. {
  2229.   return ((UBYTE) floor ((sinh (log (pow (Iterations,3.0))) * MaxColors) / (sinh (log (pow (MaxIterations,3.0))))));
  2230. }
  2231.  
  2232. UBYTE FourRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations)
  2233. {
  2234.   return ((UBYTE) floor ((cosh (log10 (pow (Iterations,3.0))) * MaxColors) / (cosh (log10 (pow (MaxIterations,3.0))))));
  2235. }
  2236.  
  2237. void MVLine (struct RastPort *Rp,const WORD b1,const WORD b2,const WORD x)
  2238. {
  2239. REGISTER WORD y;
  2240.  
  2241. REGISTER UWORD Color;
  2242.  
  2243.  CRE = RMIN + (((long long double)  x) * INCREMREAL);
  2244.  
  2245.  CIM = IMAX - (((long long double) b2) * INCREMIMAG);
  2246.  
  2247.  for (y = b2; y >= b1; y--)
  2248.  {
  2249.      Color = Mandel68K (MAX_ITERATIONS,CRE,CIM);
  2250.  
  2251.      if (Color) Color = COLORREMAP (Color,COLORS,MAX_ITERATIONS+1) + RESERVED_PENS;
  2252.  
  2253.      SetAPen (Rp,Color);
  2254.  
  2255.      CIM += INCREMIMAG;
  2256.  
  2257.      WritePixel (Rp,x,y);
  2258.  }
  2259. }
  2260.  
  2261. void MHLine (struct RastPort *Rp,const WORD a1,const WORD width,const WORD y)
  2262. {
  2263. REGISTER WORD x;
  2264.  
  2265. REGISTER UBYTE *TmpArray;
  2266.  
  2267. REGISTER UWORD Color;
  2268.  
  2269.  x = width;
  2270.  
  2271.  CRE = RMIN + (((LDouble) a1) * INCREMREAL);
  2272.  
  2273.  TmpArray = PixelLine;
  2274.  
  2275.  CIM = IMAX - (((LDouble)  y) * INCREMIMAG);
  2276.  
  2277.  while (x--)
  2278.  {
  2279.      Color = Mandel68K (MAX_ITERATIONS,CRE,CIM);
  2280.  
  2281.      if (Color) Color = COLORREMAP (Color,COLORS,MAX_ITERATIONS+1) + RESERVED_PENS;
  2282.  
  2283.      CRE += INCREMREAL;
  2284.  
  2285.      *TmpArray++ = Color;
  2286.  }
  2287.  
  2288.  WritePixelLine8 (Rp, a1, y, width, PixelLine, &TempRP);
  2289. }
  2290.  
  2291. void JVLine (struct RastPort *Rp,const WORD b1,const WORD b2,const WORD x)
  2292. {
  2293. REGISTER WORD y;
  2294.  
  2295. REGISTER UWORD Color;
  2296.  
  2297.  CRE = RMIN + (((LDouble)  x) * INCREMREAL);
  2298.  
  2299.  CIM = IMAX - (((LDouble) b2) * INCREMIMAG);
  2300.  
  2301.  for (y = b2; y >= b1; y--)
  2302.  {
  2303.      Color = Julia68K (MAX_ITERATIONS,CRE,CIM,JKRE,JKIM);
  2304.  
  2305.      if (Color) Color = COLORREMAP (Color,COLORS,MAX_ITERATIONS+1) + RESERVED_PENS;
  2306.  
  2307.      SetAPen (Rp,Color);
  2308.  
  2309.      CIM += INCREMIMAG;
  2310.  
  2311.      WritePixel (Rp,x,y);
  2312.  }
  2313. }
  2314.  
  2315. void JHLine (struct RastPort *Rp,const WORD a1,const WORD width,const WORD y)
  2316. {
  2317. REGISTER WORD x;
  2318.  
  2319. REGISTER UBYTE *TmpArray;
  2320.  
  2321. REGISTER UWORD Color;
  2322.  
  2323.  x = width;
  2324.  
  2325.  CRE = RMIN + (((LDouble) a1) * INCREMREAL);
  2326.  
  2327.  TmpArray = PixelLine;
  2328.  
  2329.  CIM = IMAX - (((LDouble)  y) * INCREMIMAG);
  2330.  
  2331.  while (x--)
  2332.  {
  2333.      Color = Julia68K (MAX_ITERATIONS,CRE,CIM,JKRE,JKIM);
  2334.  
  2335.      if (Color) Color = COLORREMAP (Color,COLORS,MAX_ITERATIONS+1) + RESERVED_PENS;
  2336.  
  2337.      CRE += INCREMREAL;
  2338.  
  2339.      *TmpArray++ = Color;
  2340.  }
  2341.  
  2342.  WritePixelLine8 (Rp, a1, y, width, PixelLine, &TempRP);
  2343. }
  2344.  
  2345. BOOL CheckBox (struct RastPort *Rp,const WORD a1,const WORD b1,const WORD a2,const WORD b2)
  2346. {
  2347. const LONG Color = ReadPixel (Rp,a1,b1);
  2348.  
  2349. REGISTER WORD Var;
  2350.  
  2351.   if (Color != ReadPixel (Rp,a2,b2)) return FALSE;
  2352.  
  2353.   if (Color != ReadPixel (Rp,a2,b1)) return FALSE;
  2354.  
  2355.   if (Color != ReadPixel (Rp,a1,b2)) return FALSE;
  2356.  
  2357.   for (Var = (a1 + 1L); Var < a2; Var++)
  2358.   {
  2359.       if (Color != ReadPixel (Rp,Var,b1)) return FALSE;
  2360.  
  2361.       if (Color != ReadPixel (Rp,Var,b2)) return FALSE;
  2362.   }
  2363.  
  2364.   for (Var = (b1 + 1L); Var < b2; Var++)
  2365.   {
  2366.       if (Color != ReadPixel (Rp,a1,Var)) return FALSE;
  2367.  
  2368.       if (Color != ReadPixel (Rp,a2,Var)) return FALSE;
  2369.   }
  2370.  
  2371.   return TRUE;
  2372. }
  2373.  
  2374. void BlinkRect (struct Window *Win,const WORD LeftEdge,const WORD TopEdge,const WORD RightEdge,const WORD BottomEdge)
  2375. {
  2376. UBYTE Blink = BLINKTIMES;
  2377.  
  2378.   DisplayBeep (Win->WScreen);
  2379.  
  2380.   ZOOMLINE [8] = ZOOMLINE [0] = ZOOMLINE [6] = LeftEdge;
  2381.  
  2382.   ZOOMLINE [1] = ZOOMLINE [3] = ZOOMLINE [9] = TopEdge;
  2383.  
  2384.   ZOOMLINE [2] = ZOOMLINE [4] = RightEdge;
  2385.  
  2386.   ZOOMLINE [5] = ZOOMLINE [7] = BottomEdge;
  2387.  
  2388.   while (Blink--)
  2389.   {
  2390.      DrawBorder (Win->RPort,&MYBORDER,0,0);
  2391.  
  2392.      Delay (8L);
  2393.  
  2394.      DrawBorder (Win->RPort,&MYBORDER,0,0);
  2395.  
  2396.      Delay (8L);
  2397.   }
  2398. }
  2399.  
  2400. BOOL RectangleDraw (struct Window *Win,const WORD a1,const WORD b1,const WORD a2,const WORD b2)
  2401. {
  2402. struct IntuiMessage *Message;
  2403.  
  2404. UWORD MyCode;
  2405.  
  2406. WORD helpx,helpy;
  2407.  
  2408. ULONG MyClass;
  2409.  
  2410.   if ((helpx = (a2 - a1)) < MINLIMIT) return FALSE;
  2411.  
  2412.   if ((helpy = (b2 - b1)) < MINLIMIT) return FALSE;
  2413.  
  2414.   if (Win->UserPort->mp_SigBit)
  2415.   {
  2416.      if (Message = (struct IntuiMessage *) GT_GetIMsg (Win->UserPort))
  2417.      {
  2418.         MyClass = Message->Class;
  2419.  
  2420.         MyCode  = Message->Code;
  2421.  
  2422.         GT_ReplyIMsg ((struct IntuiMessage *) Message);
  2423.  
  2424.         switch (MyClass)
  2425.         {
  2426.           case IDCMP_MENUPICK    : if (MyCode != MENUNULL)
  2427.                                    {
  2428.                                       if (ProcessMenu (Win,MyCode) & STOP_MSG) return TRUE;
  2429.                                    }
  2430.  
  2431.                                    break;
  2432.  
  2433.           case IDCMP_RAWKEY      : if (MyCode == TAB)
  2434.                                    {
  2435.                                       BlinkRect (Win,a1,b1,a2,b2);
  2436.  
  2437.                                       return FALSE;
  2438.                                    }
  2439.  
  2440.                                    if (MyCode == RAW_ESC)
  2441.                                    {
  2442.                                       DisplayBeep (Win->WScreen);
  2443.  
  2444.                                       return TRUE;
  2445.                                    }
  2446.  
  2447.                                    break;
  2448.  
  2449.           case IDCMP_CLOSEWINDOW : return TRUE;
  2450.         }
  2451.      }
  2452.   }
  2453.  
  2454.   if (CheckBox (Win->RPort,a1,b1,a2,b2))
  2455.   {
  2456.      SetAPen (Win->RPort,ReadPixel (Win->RPort,a1,b1));
  2457.  
  2458.      RectFill (Win->RPort,a1+1L,b1+1L,a2-1L,b2-1L);
  2459.  
  2460.      return FALSE;
  2461.   }
  2462.  
  2463.   if ((helpx < (MINLIMIT * 2L)) || (helpy < (MINLIMIT * 2L)))
  2464.   {
  2465.      for (helpx = (a1 + 1L); helpx < a2; helpx++)
  2466.      {
  2467.          (*V_LINE) (Win->RPort,b1+1L,b2-1L,helpx);
  2468.      }
  2469.  
  2470.      return FALSE;
  2471.   }
  2472.  
  2473.   if (helpx >= helpy)
  2474.   {
  2475.      helpx = (a1 + a2) >> 1L;
  2476.  
  2477.      (*V_LINE) (Win->RPort,b1+1L,b2-1L,helpx);
  2478.  
  2479.      if (RectangleDraw (Win,a1,b1,helpx,b2)) return TRUE;
  2480.  
  2481.      if (RectangleDraw (Win,helpx,b1,a2,b2)) return TRUE;
  2482.   }
  2483.  
  2484.   else
  2485.   {
  2486.      helpy = (b1 + b2) >> 1L;
  2487.  
  2488.      (*H_LINE) (Win->RPort,a1+1L,a2-a1-1,helpy);
  2489.  
  2490.      if (RectangleDraw (Win,a1,b1,a2,helpy)) return TRUE;
  2491.  
  2492.      if (RectangleDraw (Win,a1,helpy,a2,b2)) return TRUE;
  2493.   }
  2494.  
  2495.   return FALSE;
  2496. }
  2497.  
  2498. void CalcFractal (struct Window *Win,const WORD a1,const WORD b1,const WORD a2,const WORD b2)
  2499. {
  2500.  if (MANDChunk.Flags & JULIA_BIT)
  2501.  {
  2502.     H_LINE = JHLine;
  2503.  
  2504.     V_LINE = JVLine;
  2505.  }
  2506.  
  2507.  else if (MANDChunk.Flags & MANDEL_BIT)
  2508.       {
  2509.          H_LINE = MHLine;
  2510.  
  2511.          V_LINE = MVLine;
  2512.       }
  2513.  
  2514.  if (MANDChunk.Flags & LINEAR_BIT) COLORREMAP = LinearRemap;
  2515.  
  2516.  else if (MANDChunk.Flags & LOG_BIT) COLORREMAP = LogRemap;
  2517.  
  2518.       else if (MANDChunk.Flags & REPEATED_BIT) COLORREMAP = RepeatedRemap;
  2519.  
  2520.            else if (MANDChunk.Flags & SQUARE_BIT) COLORREMAP = SquareRootRemap;
  2521.  
  2522.                 else if (MANDChunk.Flags & ONE_BIT) COLORREMAP = OneRemap;
  2523.  
  2524.                      else if (MANDChunk.Flags & TWO_BIT) COLORREMAP = TwoRemap;
  2525.  
  2526.                           else if (MANDChunk.Flags & THREE_BIT) COLORREMAP = ThreeRemap;
  2527.  
  2528.                                else if (MANDChunk.Flags & FOUR_BIT) COLORREMAP = FourRemap;
  2529.  
  2530.  INCREMREAL = (fabs (RMAX-RMIN)) / ((LDouble) (a2 - a1 + 1));
  2531.  
  2532.  INCREMIMAG = (fabs (IMAX-IMIN)) / ((LDouble) (b2 - b1 + 1));
  2533.  
  2534.  (*H_LINE) (Win->RPort,a1,a2-a1+1,b1);
  2535.  
  2536.  (*V_LINE) (Win->RPort,b1+1,b2-1,a2);
  2537.  
  2538.  (*H_LINE) (Win->RPort,a1,a2-a1+1,b2);
  2539.  
  2540.  (*V_LINE) (Win->RPort,b1+1,b2-1,a1);
  2541.  
  2542.  RectangleDraw (Win,a1,b1,a2,b2);
  2543. }
  2544.  
  2545. ULONG DrawFractal (struct Window *Win,const WORD a1,const WORD b1,const WORD a2,const WORD b2)
  2546. {
  2547. ULONG StartSec = NULL , EndSec = NULL , Dummy = NULL;
  2548.  
  2549.  CurrentTime (&StartSec,&Dummy);
  2550.  
  2551.  if (TMASK & MASK) ShowTitle (Win->WScreen,FALSE);
  2552.  
  2553.  if (MANDChunk.Flags & PPC_BIT)
  2554.  {
  2555.     MANDChunk.LeftEdge = a1;
  2556.  
  2557.     MANDChunk.TopEdge = b1;
  2558.  
  2559.     MANDChunk.Width = a2-1;
  2560.  
  2561.     MANDChunk.Height = b2-1;
  2562.  
  2563.     MANDChunk.RMin = RMIN;
  2564.  
  2565.     MANDChunk.RMax = RMAX;
  2566.  
  2567.     MANDChunk.IMin = IMIN;
  2568.  
  2569.     MANDChunk.IMax = IMAX;
  2570.  
  2571.     MANDChunk.JKre = JKRE;
  2572.  
  2573.     MANDChunk.JKim = JKIM;
  2574.  
  2575.     MANDChunk.Iterations = (ULONG) (MAX_ITERATIONS + 1L);
  2576.  
  2577.     MANDChunk.Colors = COLORS;
  2578.  
  2579.     MANDChunk.Modulo = a2 - a1 + Win->BorderLeft + Win->BorderRight;
  2580.  
  2581.     CalcFractalPPC (&MANDChunk,GfxPpcMem);
  2582.  
  2583.     WritePixelArray8 (Win->RPort,a1,b1,a2-1,b2-1,GfxPpcMem,&TempRP);
  2584.  }
  2585.  
  2586.  if (MANDChunk.Flags & MC68K_BIT) CalcFractal (Win,a1,b1,a2-1,b2-1);
  2587.  
  2588.  if (TMASK & MASK) ShowTitle (Win->WScreen,TRUE);
  2589.  
  2590.  CurrentTime (&EndSec,&Dummy);
  2591.  
  2592.  DisplayBeep (Win->WScreen);
  2593.  
  2594.  return (EndSec-StartSec);
  2595. }
  2596.  
  2597. BOOL Preview (struct Window *Win,LONG Width,LONG Height)
  2598. {
  2599. struct Window *PreviewWin;
  2600.  
  2601. struct IntuiMessage *Message;
  2602.  
  2603. BOOL Error = FALSE;
  2604.  
  2605. UWORD MyCode;
  2606.  
  2607. ULONG MyClass;
  2608.  
  2609.  MYBITMAP = CopyBitMap (Win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1);
  2610.  
  2611.  PreviewWin = OpenWindowTags (0,WA_Left,Win->LeftEdge + 25,
  2612.                                 WA_Top,Win->TopEdge + 35,
  2613.                                 WA_Width,Width  / 2,
  2614.                                 WA_Height,Height / 2,
  2615.                                 WA_Title,"Preview window",
  2616.                                 WA_ScreenTitle,"¼ Window preview...",
  2617.                                 WA_CustomScreen,Win->WScreen,
  2618.                                 WA_IDCMP,IDCMP_RAWKEY|IDCMP_CLOSEWINDOW,
  2619.                                 WA_Flags,WFLG_ACTIVATE|WFLG_CLOSEGADGET|WFLG_DRAGBAR|WFLG_NOCAREREFRESH|WFLG_SMART_REFRESH|WFLG_RMBTRAP|WFLG_GIMMEZEROZERO,
  2620.                                 WA_BusyPointer,TRUE,
  2621.                                 TAG_END);
  2622.  if (PreviewWin)
  2623.  {
  2624.     PasteBitMap (MYBITMAP,PreviewWin,ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1);
  2625.  
  2626.     PutPointer (PreviewWin,0,0,0,0,0,BUSY_POINTER);
  2627.  
  2628.     ELAPSEDTIME = DrawFractal (PreviewWin,0,0,PreviewWin->GZZWidth,PreviewWin->GZZHeight);
  2629.  
  2630.     PutPointer (PreviewWin,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  2631.  
  2632.     ShowTime (PreviewWin,"Preview elapsed time:",ELAPSEDTIME);
  2633.  
  2634.     while (1L)
  2635.     {
  2636.          WaitPort (PreviewWin->UserPort);
  2637.  
  2638.          if (Message = (struct IntuiMessage *) GT_GetIMsg (PreviewWin->UserPort))
  2639.          {
  2640.             MyClass = Message->Class;
  2641.  
  2642.             MyCode  = Message->Code;
  2643.  
  2644.             GT_ReplyIMsg ((struct IntuiMessage *) Message);
  2645.  
  2646.             if (MyClass == IDCMP_CLOSEWINDOW) break;
  2647.  
  2648.             if ((MyClass == IDCMP_RAWKEY) && (MyCode == RAW_ESC)) break;
  2649.          }
  2650.     }
  2651.  
  2652.     PutPointer (PreviewWin,0,0,0,0,0,CLEAR_POINTER);
  2653.  
  2654.     CloseWindow (PreviewWin);
  2655.  }
  2656.  
  2657.  else
  2658.  {
  2659.     if (BMASK & MASK)
  2660.     {
  2661.        FreeBitMapSafety (MYBITMAP);
  2662.  
  2663.        MASK &= ~BMASK;
  2664.     }
  2665.  
  2666.     Fail (PreviewWindowError,15L);
  2667.  
  2668.     Error = TRUE;
  2669.  }
  2670.  
  2671.  return Error;
  2672. }
  2673.  
  2674. BOOL DrawFrame (struct Window *Win,const WORD Zx,const WORD Zy,const WORD Zw,const WORD Zh)
  2675. {
  2676. WORD LeftEdge,TopEdge,RightEdge,BottomEdge;
  2677.  
  2678.   if ((Zx > 2) && (Zy > 2) && (Zx < Win->Width - 2) && (Zy < Win->Height - 2) && ((Zw >= INITIALZOOM) || (Zh >= INITIALZOOM)))
  2679.   {
  2680.      LeftEdge   = Zx - Zw;
  2681.  
  2682.      TopEdge    = Zy - Zh;
  2683.  
  2684.      RightEdge  = Zx + Zw;
  2685.  
  2686.      BottomEdge = Zy + Zh;
  2687.  
  2688.      if ((LeftEdge >= 0) && (TopEdge >= 0) && (RightEdge <= Win->Width) && (BottomEdge <= Win->Height))
  2689.      {
  2690.         ZOOMLINE [8] = ZOOMLINE [0] = ZOOMLINE [6] = LeftEdge;
  2691.  
  2692.         ZOOMLINE [1] = ZOOMLINE [3] = ZOOMLINE [9] = TopEdge;
  2693.  
  2694.         ZOOMLINE [2] = ZOOMLINE [4] = RightEdge;
  2695.  
  2696.         ZOOMLINE [5] = ZOOMLINE [7] = BottomEdge;
  2697.      }
  2698.  
  2699.      DrawBorder (Win->RPort,&MYBORDER,0,0);
  2700.  
  2701.      MASK |= ZMASK;
  2702.   }
  2703.  
  2704.   else MASK &= ~ZMASK;
  2705.  
  2706.   return (BOOL) (ZMASK & MASK);
  2707. }
  2708.  
  2709. BOOL FileRequest (struct Window *Win,TEXT *String,TEXT *DrawerTxt,BOOL DrawerType,BOOL Save)
  2710. {
  2711. struct FileRequester *MyFileReq;
  2712.  
  2713. static struct EasyStruct MyReq = { sizeof (struct EasyStruct),0,"Overwrite file requester","File already exists...\n\nDo you want overwrite it ?","Yes|No" };
  2714.  
  2715. BPTR MyLock;
  2716.  
  2717. BOOL Success = FALSE;
  2718.  
  2719.   if (MyFileReq = AllocAslRequest (ASL_FileRequest,0))
  2720.   {
  2721.      MYDIR = (DrawerType ? PALETTESDIR : PICTURESDIR);
  2722.  
  2723.      if (! strlen (MYDIR)) strncpy (MYDIR,DrawerTxt,MAX_DIRLEN);
  2724.  
  2725.      if (AslRequestTags (MyFileReq,ASLFR_Window,Win,
  2726.                                    ASLFR_InitialLeftEdge,Win->LeftEdge + 25,
  2727.                                    ASLFR_InitialTopEdge,Win->TopEdge + 35,
  2728.                                    ASLFR_InitialWidth,300,
  2729.                                    ASLFR_InitialHeight,((Win->Height) * 7) >> 3,
  2730.                                    ASLFR_SleepWindow,TRUE,
  2731.                                    ASLFR_TextAttr,&MYFONTSTRUCT,
  2732.                                    ASLFR_TitleText,String,
  2733.                                    ASLFR_InitialDrawer,MYDIR,
  2734.                                    ASLFR_InitialFile,MYFILE,
  2735.                                    ASLFR_DoSaveMode,Save,
  2736.                                    ASLFR_RejectIcons,TRUE,
  2737.                                    TAG_END))
  2738.      {
  2739.         strncpy (MYFILE,MyFileReq->rf_File,MAX_FILELEN);
  2740.  
  2741.         strncpy (MYDIR,MyFileReq->rf_Dir,MAX_DIRLEN);
  2742.  
  2743.         strcpy (MYPATH,MYDIR);
  2744.  
  2745.         Success = AddPart (MYPATH,MYFILE,sizeof (MYPATH));
  2746.      }
  2747.  
  2748.      FreeAslRequest (MyFileReq);
  2749.  
  2750.      if (Save && Success)
  2751.      {
  2752.         if (MyLock = Lock (MYPATH,ACCESS_READ))
  2753.         {
  2754.            UnLock (MyLock);
  2755.  
  2756.            if (! EasyRequest (Win,&MyReq,0)) Success = FALSE;
  2757.         }
  2758.      }
  2759.   }
  2760.  
  2761.   return Success;
  2762. }
  2763.  
  2764. BOOL FontRequest (struct Window *Win)
  2765. {
  2766. struct FontRequester *MyFontReq;
  2767.  
  2768. BOOL Success = FALSE;
  2769.  
  2770.   if (MyFontReq = AllocAslRequest (ASL_FontRequest,0))
  2771.   {
  2772.      if (AslRequestTags (MyFontReq,ASLFO_Window,Win,
  2773.                                    ASLFO_InitialLeftEdge,Win->LeftEdge + 25,
  2774.                                    ASLFO_InitialTopEdge,Win->TopEdge + 35,
  2775.                                    ASLFO_InitialWidth,300,
  2776.                                    ASLFO_InitialHeight,((Win->Height) * 7) >> 3,
  2777.                                    ASLFO_SleepWindow,TRUE,
  2778.                                    ASLFO_TextAttr,&MYFONTSTRUCT,
  2779.                                    ASLFO_TitleText,"Font requester",
  2780.                                    ASLFO_InitialName,MYFONTSTRUCT.ta_Name,
  2781.                                    ASLFO_InitialSize,MYFONTSTRUCT.ta_YSize,
  2782.                                    ASLFO_InitialStyle,MYFONTSTRUCT.ta_Style,
  2783.                                    ASLFO_InitialFlags,MYFONTSTRUCT.ta_Flags,
  2784.                                    ASLFO_DoFrontPen,TRUE,
  2785.                                    ASLFO_DoBackPen,TRUE,
  2786.                                    ASLFO_DoStyle,TRUE,
  2787.                                    ASLFO_DoDrawMode,TRUE,
  2788.                                    ASLFO_MinHeight,8,
  2789.                                    ASLFO_MaxHeight,24,
  2790.                                    TAG_END))
  2791.      {
  2792.        strncpy (MYFONTSTRUCT.ta_Name,MyFontReq->fo_Attr.ta_Name,MAX_FILELEN);
  2793.  
  2794.        MYFONTSTRUCT.ta_YSize = MyFontReq->fo_Attr.ta_YSize;
  2795.  
  2796.        MYFONTSTRUCT.ta_Style = MyFontReq->fo_Attr.ta_Style;
  2797.  
  2798.        MYFONTSTRUCT.ta_Flags = MyFontReq->fo_Attr.ta_Flags;
  2799.  
  2800.        Success = TRUE;
  2801.      }
  2802.  
  2803.      FreeAslRequest (MyFontReq);
  2804.   }
  2805.  
  2806.   return Success;
  2807. }
  2808.  
  2809. static ULONG HOOKCALL SMFilterFunc (REG (a0,struct Hook *Hook),REG (a2,struct ScreenModeRequester *SMReq),REG (a1,ULONG DisplayID))
  2810. {
  2811. DisplayInfoHandle DisplayHandle;
  2812.  
  2813. struct DisplayInfo DisplayInfo;
  2814.  
  2815. struct DimensionInfo DimensionInfo;
  2816.  
  2817. ULONG Accept = NULL;
  2818.  
  2819.   DisplayHandle = FindDisplayInfo (DisplayID);
  2820.  
  2821.   if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DisplayInfo,sizeof (struct DisplayInfo),DTAG_DISP,DisplayID))
  2822.   {
  2823.      if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DimensionInfo,sizeof (struct DimensionInfo),DTAG_DIMS,DisplayID))
  2824.      {
  2825.         Accept = (ULONG) ((DimensionInfo.MaxDepth <= MAX_DEPTH) && (DisplayInfo.PropertyFlags & DIPF_IS_WB));
  2826.      }
  2827.   }
  2828.  
  2829.   return Accept;
  2830. }
  2831.  
  2832. BOOL SMRequest (struct ILBMInfo *Ilbm)
  2833. {
  2834. struct ScreenModeRequester *SMReq;
  2835.  
  2836. struct Window *Win = Ilbm->win;
  2837.  
  2838. BOOL NewScreen = FALSE;
  2839.  
  2840.  if (SMReq = AllocAslRequest (ASL_ScreenModeRequest,NULL))
  2841.  {
  2842.     if (AslRequestTags (SMReq,ASLSM_Window,Win,
  2843.                               ASLSM_SleepWindow,TRUE,
  2844.                               ASLSM_TitleText,"ScreenMode requester",
  2845.                               ASLSM_InitialLeftEdge,Win->LeftEdge + 25,
  2846.                               ASLSM_InitialTopEdge,Win->TopEdge + 35,
  2847.                               ASLSM_InitialWidth,310,
  2848.                               ASLSM_InitialHeight,((Win->Height) * 7) >> 3,
  2849.                               ASLSM_InitialDisplayID,GetVPModeID (Ilbm->vp),
  2850.                               ASLSM_InitialDisplayWidth,Win->Width,
  2851.                               ASLSM_InitialDisplayHeight,Win->Height,
  2852.                               ASLSM_InitialDisplayDepth,Ilbm->wrp->BitMap->Depth,
  2853.                               ASLSM_InitialOverscanType,Ilbm->ucliptype,
  2854.                               ASLSM_InitialInfoOpened,TRUE,
  2855.                               ASLSM_InitialInfoLeftEdge,Win->LeftEdge + 310 + 15,
  2856.                               ASLSM_InitialInfoTopEdge,Win->TopEdge,
  2857.                               ASLSM_DoWidth,TRUE,
  2858.                               ASLSM_DoHeight,TRUE,
  2859.                               ASLSM_DoDepth,TRUE,
  2860.                               ASLSM_DoOverscanType,TRUE,
  2861.                               ASLSM_MinDepth,MIN_DEPTH,
  2862.                               ASLSM_MaxDepth,MAX_DEPTH,
  2863.                               ASLSM_PropertyFlags,DIPF_IS_WB,
  2864.                               ASLSM_PropertyMask,DIPF_IS_DUALPF|DIPF_IS_PF2PRI|DIPF_IS_HAM|DIPF_IS_EXTRAHALFBRITE,
  2865.                               ASLSM_FilterFunc,&SMFILTERHOOK,
  2866.                               ASLSM_MinWidth,MIN_WIDTH,
  2867.                               ASLSM_MinHeight,MIN_HEIGHT,
  2868.                               TAG_END))
  2869.     {
  2870.        Ilbm->camg = SMReq->sm_DisplayID;
  2871.  
  2872.        Ilbm->Bmhd.w = SMReq->sm_DisplayWidth;
  2873.  
  2874.        Ilbm->Bmhd.h = SMReq->sm_DisplayHeight;
  2875.  
  2876.        Ilbm->Bmhd.nPlanes = SMReq->sm_DisplayDepth;
  2877.  
  2878.        Ilbm->ucliptype = SMReq->sm_OverscanType;
  2879.  
  2880.        NewScreen = TRUE;
  2881.     }
  2882.  
  2883.     FreeAslRequest (SMReq);
  2884.  }
  2885.  
  2886.  return NewScreen;
  2887. }
  2888.  
  2889. VOID SetMenuStart (struct Window *Win)
  2890. {
  2891.   OnMenu  (Win,FULLMENUNUM (0,0,NOSUB));
  2892.  
  2893.   OnMenu  (Win,FULLMENUNUM (0,2,NOSUB));
  2894.  
  2895.   OnMenu  (Win,FULLMENUNUM (0,4,NOSUB));
  2896.  
  2897.   OnMenu  (Win,FULLMENUNUM (0,6,NOSUB));
  2898.  
  2899.   OnMenu  (Win,FULLMENUNUM (0,7,NOSUB));
  2900.  
  2901.   OnMenu  (Win,FULLMENUNUM (0,8,NOSUB));
  2902.  
  2903.   OnMenu  (Win,FULLMENUNUM (0,9,NOSUB));
  2904.  
  2905.   OnMenu  (Win,FULLMENUNUM (0,11,NOSUB));
  2906.  
  2907.   OnMenu  (Win,FULLMENUNUM (0,13,NOSUB));
  2908.  
  2909.   OnMenu  (Win,FULLMENUNUM (1,0,NOSUB));
  2910.  
  2911.   OnMenu  (Win,FULLMENUNUM (1,1,NOSUB));
  2912.  
  2913.   OnMenu  (Win,FULLMENUNUM (1,2,NOSUB));
  2914.  
  2915.   OnMenu  (Win,FULLMENUNUM (1,4,NOSUB));
  2916.  
  2917.   OnMenu  (Win,FULLMENUNUM (1,5,NOSUB));
  2918.  
  2919.   OnMenu  (Win,FULLMENUNUM (1,6,NOSUB));
  2920.  
  2921.   OnMenu  (Win,FULLMENUNUM (2,2,NOSUB));
  2922.  
  2923.   OffMenu (Win,FULLMENUNUM (2,7,NOSUB));
  2924.  
  2925.   OnMenu  (Win,FULLMENUNUM (3,0,NOSUB));
  2926.  
  2927.   OnMenu  (Win,FULLMENUNUM (3,2,NOSUB));
  2928.  
  2929.   OnMenu  (Win,FULLMENUNUM (3,4,NOSUB));
  2930.  
  2931.   OnMenu  (Win,FULLMENUNUM (3,6,NOSUB));
  2932. }
  2933.  
  2934. VOID SetMenuStop (struct Window *Win)
  2935. {
  2936.   OffMenu  (Win,FULLMENUNUM (0,0,NOSUB));
  2937.  
  2938.   OffMenu  (Win,FULLMENUNUM (0,2,NOSUB));
  2939.  
  2940.   OffMenu  (Win,FULLMENUNUM (0,4,NOSUB));
  2941.  
  2942.   OffMenu  (Win,FULLMENUNUM (0,6,NOSUB));
  2943.  
  2944.   OffMenu  (Win,FULLMENUNUM (0,7,NOSUB));
  2945.  
  2946.   OffMenu  (Win,FULLMENUNUM (0,8,NOSUB));
  2947.  
  2948.   OffMenu  (Win,FULLMENUNUM (0,9,NOSUB));
  2949.  
  2950.   OffMenu  (Win,FULLMENUNUM (0,11,NOSUB));
  2951.  
  2952.   OffMenu  (Win,FULLMENUNUM (0,13,NOSUB));
  2953.  
  2954.   OffMenu  (Win,FULLMENUNUM (1,0,NOSUB));
  2955.  
  2956.   OffMenu  (Win,FULLMENUNUM (1,1,NOSUB));
  2957.  
  2958.   OffMenu  (Win,FULLMENUNUM (1,2,NOSUB));
  2959.  
  2960.   OffMenu  (Win,FULLMENUNUM (1,4,NOSUB));
  2961.  
  2962.   OffMenu  (Win,FULLMENUNUM (1,5,NOSUB));
  2963.  
  2964.   OffMenu  (Win,FULLMENUNUM (1,6,NOSUB));
  2965.  
  2966.   OffMenu  (Win,FULLMENUNUM (2,0,NOSUB));
  2967.  
  2968.   OffMenu  (Win,FULLMENUNUM (2,2,NOSUB));
  2969.  
  2970.   OffMenu  (Win,FULLMENUNUM (2,6,NOSUB));
  2971.  
  2972.   OnMenu   (Win,FULLMENUNUM (2,7,NOSUB));
  2973.  
  2974.   OffMenu  (Win,FULLMENUNUM (3,0,NOSUB));
  2975.  
  2976.   OffMenu  (Win,FULLMENUNUM (3,2,NOSUB));
  2977.  
  2978.   OffMenu  (Win,FULLMENUNUM (3,4,NOSUB));
  2979.  
  2980.   OffMenu  (Win,FULLMENUNUM (3,6,NOSUB));
  2981. }
  2982.  
  2983. ULONG ProcessMenu (struct Window *Win,UWORD Code)
  2984. {
  2985. struct MenuItem *Item;
  2986.  
  2987. ULONG Choice = NULL;
  2988.  
  2989.  while (Code != MENUNULL)
  2990.  {
  2991.   Item = ItemAddress (MAINMENU,(ULONG) Code);
  2992.  
  2993.   switch (MENUNUM (Code))
  2994.   {
  2995.         case 0:    switch (ITEMNUM (Code))
  2996.                    {
  2997.                         case 0: Choice |= ABOUT_MSG;
  2998.  
  2999.                                 break;
  3000.  
  3001.                         case 2: Choice |= SYSINFO_MSG;
  3002.  
  3003.                                 break;
  3004.  
  3005.                         case 4: Choice |= SHOWGUIDE_MSG;
  3006.  
  3007.                                 break;
  3008.  
  3009.                         case 6: Choice |= LOADPICTURE_MSG;
  3010.  
  3011.                                 break;
  3012.  
  3013.                         case 7: Choice |= SAVEPICTURE_MSG;
  3014.  
  3015.                                 break;
  3016.  
  3017.                         case 8: Choice |= LOADPALETTE_MSG;
  3018.  
  3019.                                 break;
  3020.  
  3021.                         case 9: Choice |= SAVEPALETTE_MSG;
  3022.  
  3023.                                 break;
  3024.  
  3025.                         case 11: Choice |= DUMP_MSG;
  3026.  
  3027.                                 break;
  3028.  
  3029.                         case 13: Choice |= EXIT_MSG;
  3030.  
  3031.                                 break;
  3032.                    }
  3033.  
  3034.                    break;
  3035.  
  3036.         case 1:    switch (ITEMNUM (Code))
  3037.                    {
  3038.                         case 0: switch (SUBNUM (Code))
  3039.                                 {
  3040.                                    case 0: Choice |= TITLE_MSG;
  3041.  
  3042.                                            break;
  3043.  
  3044.                                    case 2: Choice |= TIME_MSG;
  3045.  
  3046.                                            break;
  3047.                                 }
  3048.  
  3049.                                 break;
  3050.  
  3051.                         case 1: Choice |= COORDS_MSG;
  3052.  
  3053.                                 break;
  3054.  
  3055.                         case 2: switch (SUBNUM (Code))
  3056.                                 {
  3057.                                    case 0: MAX_ITERATIONS = 255;
  3058.  
  3059.                                            break;
  3060.  
  3061.                                    case 1: MAX_ITERATIONS = 319;
  3062.  
  3063.                                            break;
  3064.  
  3065.                                    case 2: MAX_ITERATIONS = 511;
  3066.  
  3067.                                            break;
  3068.  
  3069.                                    case 3: MAX_ITERATIONS = 1023;
  3070.  
  3071.                                            break;
  3072.  
  3073.                                    case 4: MAX_ITERATIONS = 2047;
  3074.  
  3075.                                            break;
  3076.  
  3077.                                    case 5: MAX_ITERATIONS = 4095;
  3078.  
  3079.                                            break;
  3080.  
  3081.                                    case 6: MAX_ITERATIONS = 8191;
  3082.  
  3083.                                            break;
  3084.  
  3085.                                    case 7: MAX_ITERATIONS = 16383;
  3086.  
  3087.                                            break;
  3088.  
  3089.                                    case 8: MAX_ITERATIONS = 32767;
  3090.  
  3091.                                            break;
  3092.  
  3093.                                   case 10: Choice |= ITER_MSG;
  3094.  
  3095.                                            break;
  3096.                                 }
  3097.  
  3098.                                 break;
  3099.  
  3100.                         case 3: switch (SUBNUM (Code))
  3101.                                 {
  3102.                                    case  0: PRIORITY = -5;
  3103.  
  3104.                                             break;
  3105.  
  3106.                                    case  1: PRIORITY = -4;
  3107.  
  3108.                                             break;
  3109.  
  3110.                                    case  2: PRIORITY = -3;
  3111.  
  3112.                                             break;
  3113.  
  3114.                                    case  3: PRIORITY = -2;
  3115.  
  3116.                                             break;
  3117.  
  3118.                                    case  4: PRIORITY = -1;
  3119.  
  3120.                                             break;
  3121.  
  3122.                                    case  6: PRIORITY =  0;
  3123.  
  3124.                                             break;
  3125.  
  3126.                                    case  8: PRIORITY =  1;
  3127.  
  3128.                                             break;
  3129.  
  3130.                                    case  9: PRIORITY =  2;
  3131.  
  3132.                                             break;
  3133.  
  3134.                                    case 10: PRIORITY =  3;
  3135.  
  3136.                                             break;
  3137.  
  3138.                                    case 11: PRIORITY =  4;
  3139.  
  3140.                                             break;
  3141.  
  3142.                                    case 12: PRIORITY =  5;
  3143.  
  3144.                                             break;
  3145.  
  3146.                                 }
  3147.  
  3148.                                 Forbid ();
  3149.  
  3150.                                 THISTASK = FindTask (NULL);
  3151.  
  3152.                                 Permit ();
  3153.  
  3154.                                 SetTaskPri (THISTASK,PRIORITY);
  3155.  
  3156.                                 break;
  3157.  
  3158.                         case 4: switch (SUBNUM (Code))
  3159.                                 {
  3160.                                    case 0: if (! (MANDChunk.Flags & LINEAR_BIT))
  3161.                                            {
  3162.                                               SaveCoords (Win,TRUE);
  3163.  
  3164.                                               MANDChunk.Flags |= LINEAR_BIT;
  3165.  
  3166.                                               MANDChunk.Flags &= ~(SQUARE_BIT|REPEATED_BIT|LOG_BIT|ONE_BIT|TWO_BIT|THREE_BIT|FOUR_BIT);
  3167.                                            }
  3168.  
  3169.                                            break;
  3170.  
  3171.                                    case 1: if (! (MANDChunk.Flags & LOG_BIT))
  3172.                                            {
  3173.                                               SaveCoords (Win,TRUE);
  3174.  
  3175.                                               MANDChunk.Flags |= LOG_BIT;
  3176.  
  3177.                                               MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|SQUARE_BIT|ONE_BIT|TWO_BIT|THREE_BIT|FOUR_BIT);
  3178.                                            }
  3179.  
  3180.                                            break;
  3181.  
  3182.                                    case 2: if (! (MANDChunk.Flags & REPEATED_BIT))
  3183.                                            {
  3184.                                               SaveCoords (Win,TRUE);
  3185.  
  3186.                                               MANDChunk.Flags |= REPEATED_BIT;
  3187.  
  3188.                                               MANDChunk.Flags &= ~(LINEAR_BIT|SQUARE_BIT|LOG_BIT|ONE_BIT|TWO_BIT|THREE_BIT|FOUR_BIT);
  3189.                                            }
  3190.  
  3191.                                            break;
  3192.  
  3193.                                    case 3: if (! (MANDChunk.Flags & SQUARE_BIT))
  3194.                                            {
  3195.                                               SaveCoords (Win,TRUE);
  3196.  
  3197.                                               MANDChunk.Flags |= SQUARE_BIT;
  3198.  
  3199.                                               MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|LOG_BIT|ONE_BIT|TWO_BIT|THREE_BIT|FOUR_BIT);
  3200.                                            }
  3201.  
  3202.                                            break;
  3203.  
  3204.                                    case 4: if (! (MANDChunk.Flags & ONE_BIT))
  3205.                                            {
  3206.                                               SaveCoords (Win,TRUE);
  3207.  
  3208.                                               MANDChunk.Flags |= ONE_BIT;
  3209.  
  3210.                                               MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|LOG_BIT|SQUARE_BIT|TWO_BIT|THREE_BIT|FOUR_BIT);
  3211.                                            }
  3212.  
  3213.                                            break;
  3214.  
  3215.                                    case 5: if (! (MANDChunk.Flags & TWO_BIT))
  3216.                                            {
  3217.                                               SaveCoords (Win,TRUE);
  3218.  
  3219.                                               MANDChunk.Flags |= TWO_BIT;
  3220.  
  3221.                                               MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|LOG_BIT|SQUARE_BIT|ONE_BIT|THREE_BIT|FOUR_BIT);
  3222.                                            }
  3223.  
  3224.                                            break;
  3225.  
  3226.                                    case 6: if (! (MANDChunk.Flags & THREE_BIT))
  3227.                                            {
  3228.                                               SaveCoords (Win,TRUE);
  3229.  
  3230.                                               MANDChunk.Flags |= THREE_BIT;
  3231.  
  3232.                                               MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|LOG_BIT|SQUARE_BIT|ONE_BIT|TWO_BIT|FOUR_BIT);
  3233.                                            }
  3234.  
  3235.                                            break;
  3236.  
  3237.                                    case 7: if (! (MANDChunk.Flags & FOUR_BIT))
  3238.                                            {
  3239.                                               SaveCoords (Win,TRUE);
  3240.  
  3241.                                               MANDChunk.Flags |= FOUR_BIT;
  3242.  
  3243.                                               MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|LOG_BIT|SQUARE_BIT|ONE_BIT|TWO_BIT|THREE_BIT);
  3244.                                            }
  3245.  
  3246.                                            break;
  3247.                                 }
  3248.  
  3249.                                 break;
  3250.  
  3251.                         case 5: switch (SUBNUM (Code))
  3252.                                 {
  3253.                                    case 0: if (! (MANDChunk.Flags & JULIA_BIT))
  3254.                                            {
  3255.                                               if (PickJuliaK (Win))
  3256.                                               {
  3257.                                                  SaveCoords (Win,TRUE);
  3258.  
  3259.                                                  MANDChunk.Flags |= JULIA_BIT;
  3260.  
  3261.                                                  MANDChunk.Flags &= ~(MANDEL_BIT|NEWTON_BIT|LYAPUNOV_BIT);
  3262.  
  3263.                                                  Choice |= REDRAW_MSG;
  3264.                                               }
  3265.                                            }
  3266.  
  3267.                                            break;
  3268.  
  3269.                                    case 1: if (! (MANDChunk.Flags & MANDEL_BIT))
  3270.                                            {
  3271.                                               SaveCoords (Win,TRUE);
  3272.  
  3273.                                               MANDChunk.Flags |= MANDEL_BIT;
  3274.  
  3275.                                               MANDChunk.Flags &= ~(JULIA_BIT|NEWTON_BIT|LYAPUNOV_BIT);
  3276.  
  3277.                                               RMIN = DEF_RMIN;
  3278.  
  3279.                                               RMAX = DEF_RMAX;
  3280.  
  3281.                                               IMIN = DEF_IMIN;
  3282.  
  3283.                                               IMAX = DEF_IMAX;
  3284.  
  3285.                                               Choice |= REDRAW_MSG;
  3286.                                            }
  3287.  
  3288.                                            break;
  3289.                                 }
  3290.  
  3291.                                 break;
  3292.  
  3293.                         case 6: switch (SUBNUM (Code))
  3294.                                 {
  3295.                                    case 0: MANDChunk.Flags |= MC68K_BIT;
  3296.  
  3297.                                            MANDChunk.Flags &= ~PPC_BIT;
  3298.  
  3299.                                            break;
  3300.  
  3301.                                    case 1: MANDChunk.Flags |= PPC_BIT;
  3302.  
  3303.                                            MANDChunk.Flags &= ~MC68K_BIT;
  3304.  
  3305.                                            break;
  3306.                                 }
  3307.                    }
  3308.  
  3309.                    break;
  3310.  
  3311.         case 2: switch (ITEMNUM (Code))
  3312.                 {
  3313.                    case 0: Choice |= PREVIEW_MSG;
  3314.  
  3315.                            break;
  3316.  
  3317.                    case 2: Choice |= REDRAW_MSG;
  3318.  
  3319.                            break;
  3320.  
  3321.                    case 4: Choice |= (UNDO_MSG | REDRAW_MSG);
  3322.  
  3323.                            break;
  3324.  
  3325.                    case 6: Choice |= DRAW_MSG;
  3326.  
  3327.                            break;
  3328.  
  3329.                    case 7: Choice |= STOP_MSG;
  3330.  
  3331.                            break;
  3332.                 }
  3333.  
  3334.                 break;
  3335.  
  3336.         case 3: switch (ITEMNUM (Code))
  3337.                 {
  3338.                    case 0: switch (SUBNUM (Code))
  3339.                            {
  3340.                               case 0: Choice |= CYCLERIGHT_MSG;
  3341.  
  3342.                                       break;
  3343.  
  3344.                               case 1: Choice |= CYCLELEFT_MSG;
  3345.  
  3346.                                       break;
  3347.  
  3348.                               case 3: Choice |= DELAY_MSG;
  3349.  
  3350.                                       break;
  3351.  
  3352.                            }
  3353.  
  3354.                            break;
  3355.  
  3356.                    case 2: Choice |= PALETTE_MSG;
  3357.  
  3358.                            break;
  3359.  
  3360.                    case 4: Choice |= NEWDISPLAY_MSG;
  3361.  
  3362.                            break;
  3363.  
  3364.                    case 6: Choice |= FONTREQ_MSG;
  3365.  
  3366.                            break;
  3367.                 }
  3368.   }
  3369.  
  3370.  Code = Item->NextSelect;
  3371.  }
  3372.  
  3373.  return Choice;
  3374. }
  3375.  
  3376. void CheckMenu (struct Window *Win)
  3377. {
  3378. UWORD Index;
  3379.  
  3380.  ClearMenuStrip (Win);
  3381.  
  3382.  for (Index = 0; Index <= 7; Index++) ItemAddress (MAINMENU,FULLMENUNUM (1,4,Index))->Flags &= ~CHECKED;
  3383.  
  3384.  if (MANDChunk.Flags & LINEAR_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,0))->Flags |= CHECKED;
  3385.  
  3386.  else if (MANDChunk.Flags & LOG_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,1))->Flags |= CHECKED;
  3387.  
  3388.       else if (MANDChunk.Flags & REPEATED_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,2))->Flags |= CHECKED;
  3389.  
  3390.            else if (MANDChunk.Flags & SQUARE_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,3))->Flags |= CHECKED;
  3391.  
  3392.                 else if (MANDChunk.Flags & ONE_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,4))->Flags |= CHECKED;
  3393.  
  3394.                      else if (MANDChunk.Flags & TWO_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,5))->Flags |= CHECKED;
  3395.  
  3396.                           else if (MANDChunk.Flags & THREE_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,6))->Flags |= CHECKED;
  3397.  
  3398.                                else if (MANDChunk.Flags & FOUR_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,4,7))->Flags |= CHECKED;
  3399.  
  3400.  for (Index = 0; Index <= 1; Index++) ItemAddress (MAINMENU,FULLMENUNUM (1,5,Index))->Flags &= ~CHECKED;
  3401.  
  3402.  if (MANDChunk.Flags & JULIA_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,0))->Flags |= CHECKED;
  3403.  
  3404.  else if (MANDChunk.Flags & MANDEL_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,1))->Flags |= CHECKED;
  3405.  
  3406.  for (Index = 0; Index <= 1; Index++) ItemAddress (MAINMENU,FULLMENUNUM (1,6,Index))->Flags &= ~CHECKED;
  3407.  
  3408.  if ((MANDChunk.Flags & PPC_BIT) && (CPUINFO & (CPU_603|CPU_603e|CPU_604|CPU_604e|CPU_620))) ItemAddress (MAINMENU,FULLMENUNUM (1,6,1))->Flags |= CHECKED;
  3409.  
  3410.  else if (MANDChunk.Flags & PPC_BIT)
  3411.       {
  3412.          MANDChunk.Flags &= ~PPC_BIT;
  3413.  
  3414.          MANDChunk.Flags |= MC68K_BIT;
  3415.       }
  3416.  
  3417.  if (MANDChunk.Flags & MC68K_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,6,0))->Flags |= CHECKED;
  3418.  
  3419.  for (Index = 0; Index <= 10; Index++) ItemAddress (MAINMENU,FULLMENUNUM (1,2,Index))->Flags &= ~CHECKED;
  3420.  
  3421.  switch (MAX_ITERATIONS)
  3422.  {
  3423.    case 255 : ItemAddress (MAINMENU,FULLMENUNUM (1,2,0))->Flags |= CHECKED;
  3424.  
  3425.               break;
  3426.  
  3427.    case 319:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,1))->Flags |= CHECKED;
  3428.  
  3429.               break;
  3430.  
  3431.    case 511:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,2))->Flags |= CHECKED;
  3432.  
  3433.               break;
  3434.  
  3435.   case 1023:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,3))->Flags |= CHECKED;
  3436.  
  3437.               break;
  3438.  
  3439.   case 2047:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,4))->Flags |= CHECKED;
  3440.  
  3441.               break;
  3442.  
  3443.   case 4095:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,5))->Flags |= CHECKED;
  3444.  
  3445.               break;
  3446.  
  3447.   case 8191:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,6))->Flags |= CHECKED;
  3448.  
  3449.               break;
  3450.  
  3451.  case 16383:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,7))->Flags |= CHECKED;
  3452.  
  3453.               break;
  3454.  
  3455.  case 32767:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,8))->Flags |= CHECKED;
  3456.  
  3457.               break;
  3458.  
  3459.     default:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,10))->Flags |= CHECKED;
  3460.  
  3461.               break;
  3462.  }
  3463.  
  3464.  ResetMenuStrip (Win,MAINMENU);
  3465. }
  3466.  
  3467. VOID ProcessMouse (struct Window *Win,WORD CurMouseX,WORD CurMouseY)
  3468. {
  3469. static WORD MX1 = 0 , MY1 = 0 , MX2 = 0 , MY2 = 0, W = 0, H = 0;
  3470.  
  3471. struct IntuiMessage *Message;
  3472.  
  3473. UWORD MyCode;
  3474.  
  3475. LONG DefaultQueue;
  3476.  
  3477. ULONG MyClass;
  3478.  
  3479.    ModifyIDCMP (Win,IDCMP_MOUSEBUTTONS | IDCMP_MOUSEMOVE);
  3480.  
  3481.    DefaultQueue = SetMouseQueue (Win,10);
  3482.  
  3483.    if (ZMASK & MASK) DrawFrame (Win,MX1,MY1,W,H);
  3484.  
  3485.    MX1 = CurMouseX;
  3486.  
  3487.    MY1 = CurMouseY;
  3488.  
  3489.    W = INITIALZOOM;
  3490.  
  3491.    H = ScalerDiv ((LONG) W,(ULONG) Win->Height,(ULONG) Win->Width);
  3492.  
  3493.    DrawFrame (Win,MX1,MY1,W,H);
  3494.  
  3495.    while (1L)
  3496.    {
  3497.      WaitPort (Win->UserPort);
  3498.  
  3499.      if (Message = (struct IntuiMessage *) GT_GetIMsg (Win->UserPort))
  3500.      {
  3501.         MyClass = Message->Class;
  3502.  
  3503.         MyCode = Message->Code;
  3504.  
  3505.         MX2 = Message->MouseX;
  3506.  
  3507.         MY2 = Message->MouseY;
  3508.  
  3509.         GT_ReplyIMsg ((struct IntuiMessage *) Message);
  3510.  
  3511.         if (MyClass == IDCMP_MOUSEMOVE)
  3512.         {
  3513.            DrawFrame (Win,MX1,MY1,W,H);
  3514.  
  3515.            W = abs (MX1 - MX2);
  3516.  
  3517.            H = abs (MY1 - MY2);
  3518.  
  3519.            if (W > H) (W = ScalerDiv ((LONG) H,(ULONG) Win->Width,(ULONG) Win->Height));
  3520.  
  3521.            else (H = ScalerDiv ((LONG) W,(ULONG) Win->Height,(ULONG) Win->Width));
  3522.  
  3523.            DrawFrame (Win,MX1,MY1,W,H);
  3524.         }
  3525.  
  3526.         else if ((MyClass == IDCMP_MOUSEBUTTONS) && (MyCode != SELECTDOWN)) break;
  3527.      }
  3528.    }
  3529.  
  3530.    SetMouseQueue (Win,(ULONG) DefaultQueue);
  3531.  
  3532.    ModifyIDCMP (Win,IDCMP_STANDARD);
  3533.  
  3534.    if (ZMASK & MASK)
  3535.    {
  3536.       OnMenu  (Win,FULLMENUNUM (2,0,NOSUB));
  3537.  
  3538.       OnMenu  (Win,FULLMENUNUM (2,6,NOSUB));
  3539.    }
  3540.  
  3541.    else
  3542.    {
  3543.       OffMenu  (Win,FULLMENUNUM (2,0,NOSUB));
  3544.  
  3545.       OffMenu  (Win,FULLMENUNUM (2,6,NOSUB));
  3546.    }
  3547. }
  3548.  
  3549. BOOL PickJuliaK (struct Window *Win)
  3550. {
  3551. struct IntuiMessage *Message;
  3552.  
  3553. BOOL Selected = FALSE, End = FALSE;
  3554.  
  3555. WORD MouseX = 0,MouseY = 0;
  3556.  
  3557. UWORD MyCode = 0;
  3558.  
  3559. ULONG MyClass = NULL;
  3560.  
  3561. LDouble RealCoord=0.0,ImagCoord=0.0;
  3562.  
  3563.  ModifyIDCMP (Win,IDCMP_MOUSEBUTTONS|IDCMP_MOUSEMOVE|IDCMP_MENUPICK);
  3564.  
  3565.  ClearMenuStrip (Win);
  3566.  
  3567.  SetWindowTitles (Win,(TEXT *) ~0,"Left mouse button to choose new Julia constant, right mouse button to cancel");
  3568.  
  3569.  Delay (TWOSECS);
  3570.  
  3571.  do { WaitPort (Win->UserPort);
  3572.  
  3573.       if (Message = (struct IntuiMessage *) GT_GetIMsg (Win->UserPort))
  3574.       {
  3575.              MyClass = Message->Class;
  3576.  
  3577.              MyCode  = Message->Code;
  3578.  
  3579.              MouseX  = Message->MouseX;
  3580.  
  3581.              MouseY  = Message->MouseY;
  3582.  
  3583.              GT_ReplyIMsg ((struct IntuiMessage *) Message);
  3584.       }
  3585.  
  3586.       switch (MyClass)
  3587.       {
  3588.              case    IDCMP_MOUSEMOVE: if (TMASK & MASK)
  3589.                                       {
  3590.                                          RealCoord = RMIN + ((LDouble) MouseX * fabs (RMAX-RMIN) / (LDouble) (Win->Width - 1));
  3591.  
  3592.                                          ImagCoord = IMAX - ((LDouble) MouseY * fabs (IMAX-IMIN) / (LDouble) (Win->Height - 1));
  3593.  
  3594.                                          sprintf (BAR_STRING,"Julia constant: Real %+2.16f Imag %+2.16fi",RealCoord,ImagCoord);
  3595.  
  3596.                                          WaitTOF ();
  3597.  
  3598.                                          SetWindowTitles (Win,(TEXT *) ~0,BAR_STRING);
  3599.                                       }
  3600.  
  3601.                                       break;
  3602.  
  3603.              case IDCMP_MOUSEBUTTONS: if (MyCode == SELECTDOWN)
  3604.                                       {
  3605.                                          JKRE = RMIN + ((LDouble) MouseX * fabs (RMAX-RMIN) / (LDouble) (Win->Width - 1));
  3606.  
  3607.                                          JKIM = IMAX - ((LDouble) MouseY * fabs (IMAX-IMIN) / (LDouble) (Win->Height - 1));
  3608.  
  3609.                                          End = Selected = TRUE;
  3610.                                       }
  3611.  
  3612.                                       break;
  3613.  
  3614.              case     IDCMP_MENUPICK: End = TRUE;
  3615.  
  3616.                                       ItemAddress (MAINMENU,FULLMENUNUM (1,5,0))->Flags &= ~CHECKED;
  3617.  
  3618.                                       ItemAddress (MAINMENU,FULLMENUNUM (1,5,1))->Flags |= CHECKED;
  3619.  
  3620.                                       break;
  3621.       }
  3622.  
  3623.     } while (End != TRUE);
  3624.  
  3625.   ResetMenuStrip (Win,MAINMENU);
  3626.  
  3627.   ModifyIDCMP (Win,IDCMP_STANDARD);
  3628.  
  3629.   return (Selected);
  3630. }
  3631.  
  3632. ULONG HandleEvents (struct ILBMInfo *Ilbm)
  3633. {
  3634. struct IntuiMessage *Message;
  3635.  
  3636. WORD MouseX = 0,MouseY = 0;
  3637.  
  3638. UWORD MyCode = 0;
  3639.  
  3640. LONG Error;
  3641.  
  3642. ULONG MyClass = NULL,MyMenu = NULL;
  3643.  
  3644. LDouble RealCoord,ImagCoord,ScrRatio,FracRatio;
  3645.  
  3646.  PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3647.  
  3648.  do { WaitPort (Ilbm->win->UserPort);
  3649.  
  3650.       if (Message = (struct IntuiMessage *) GT_GetIMsg (Ilbm->win->UserPort))
  3651.       {
  3652.              MyClass = Message->Class;
  3653.  
  3654.              MyCode  = Message->Code;
  3655.  
  3656.              MouseX  = Message->MouseX;
  3657.  
  3658.              MouseY  = Message->MouseY;
  3659.  
  3660.              GT_ReplyIMsg ((struct IntuiMessage *) Message);
  3661.       }
  3662.  
  3663.       switch (MyClass)
  3664.       {
  3665.              case    IDCMP_MOUSEMOVE: if (TMASK & MASK)
  3666.                                       {
  3667.                                          RealCoord = RMIN + ((LDouble) MouseX * fabs (RMAX-RMIN) / (LDouble) (Ilbm->win->Width - 1));
  3668.  
  3669.                                          ImagCoord = IMAX - ((LDouble) MouseY * fabs (IMAX-IMIN) / (LDouble) (Ilbm->win->Height - 1));
  3670.  
  3671.                                          ScrRatio  = (LDouble) Ilbm->win->Width / (LDouble) Ilbm->win->Height;
  3672.  
  3673.                                          FracRatio = fabs (RMAX-RMIN) / fabs (IMAX-IMIN);
  3674.  
  3675.                                          sprintf (BAR_STRING,"Real %#+2.16f Imag %#+2.16fi W:H %.3f R:I %.3f",RealCoord,ImagCoord,ScrRatio,FracRatio);
  3676.  
  3677.                                          WaitTOF ();
  3678.  
  3679.                                          SetWindowTitles (Ilbm->win,(TEXT *) ~0,BAR_STRING);
  3680.                                       }
  3681.  
  3682.                                       break;
  3683.  
  3684.              case IDCMP_MOUSEBUTTONS: if (MyCode == SELECTDOWN) ProcessMouse (Ilbm->win,MouseX,MouseY);
  3685.  
  3686.                                       break;
  3687.  
  3688.              case     IDCMP_MENUPICK: MyMenu = ProcessMenu (Ilbm->win,MyCode);
  3689.  
  3690.                                       if (MyMenu & EXIT_MSG) break;
  3691.  
  3692.                                       if (MyMenu & SHOWGUIDE_MSG)
  3693.                                       {
  3694.                                          Execute (SHOWGUIDECOMMAND,NULL,NULL);
  3695.  
  3696.                                          break;
  3697.                                       }
  3698.  
  3699.                                       if (MyMenu & TITLE_MSG)
  3700.                                       {
  3701.                                          if (TMASK & MASK) MASK &= ~TMASK;
  3702.  
  3703.                                          else MASK |= TMASK;
  3704.  
  3705.                                          Ilbm->TBState = TMASK & MASK;
  3706.  
  3707.                                          ShowTitle (Ilbm->scr,(LONG) Ilbm->TBState);
  3708.  
  3709.                                          break;
  3710.                                       }
  3711.  
  3712.                                       if (MyMenu & TIME_MSG)
  3713.                                       {
  3714.                                          if (! (TMASK & MASK)) ShowTitle (Ilbm->scr,TRUE);
  3715.  
  3716.                                          ShowTime (Ilbm->win,"Last calculating time:",ELAPSEDTIME);
  3717.  
  3718.                                          Delay (TWOSECS);
  3719.  
  3720.                                          if (! (TMASK & MASK)) ShowTitle (Ilbm->scr,FALSE);
  3721.  
  3722.                                          break;
  3723.                                       }
  3724.  
  3725.                                       if (MyMenu & ITER_MSG)
  3726.                                       {
  3727.                                          ModifyIDCMP (Ilbm->win,NULL);
  3728.  
  3729.                                          ClearMenuStrip (Ilbm->win);
  3730.  
  3731.                                          while (1L)
  3732.                                          {
  3733.                                             MAX_ITERATIONS = (UWORD) IntegerGad (Ilbm->win,"Iterations requester","Insert new iterations... between 2^5 (32) and 2^15 (32768)","_Iterations",MAX_ITERATIONS + 1L) - 1L;
  3734.  
  3735.                                             if (MAX_ITERATIONS >= MIN_ITERATIONS && MAX_ITERATIONS <= MAX_ALLOWED_ITERATIONS) break;
  3736.  
  3737.                                             DisplayBeep (Ilbm->scr);
  3738.                                          }
  3739.  
  3740.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  3741.  
  3742.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3743.  
  3744.                                          break;
  3745.                                       }
  3746.  
  3747.                                       if (MyMenu & ABOUT_MSG)
  3748.                                       {
  3749.                                          ModifyIDCMP (Ilbm->win,NULL);
  3750.  
  3751.                                          ClearMenuStrip (Ilbm->win);
  3752.  
  3753.                                          About (Ilbm->win);
  3754.  
  3755.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  3756.  
  3757.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3758.  
  3759.                                          break;
  3760.                                       }
  3761.  
  3762.                                       if (MyMenu & SYSINFO_MSG)
  3763.                                       {
  3764.                                          ModifyIDCMP (Ilbm->win,NULL);
  3765.  
  3766.                                          ClearMenuStrip (Ilbm->win);
  3767.  
  3768.                                          SystemInfo (Ilbm->win);
  3769.  
  3770.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  3771.  
  3772.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3773.  
  3774.                                          break;
  3775.                                       }
  3776.  
  3777.                                       if (MyMenu & PALETTE_MSG)
  3778.                                       {
  3779.                                          ModifyIDCMP (Ilbm->win,NULL);
  3780.  
  3781.                                          ClearMenuStrip (Ilbm->win);
  3782.  
  3783.                                          if (! ModifyPalette (Ilbm->win,Ilbm->win->LeftEdge + 25,Ilbm->win->TopEdge + 35,PALETTE)) Fail (PaletteRequesterError,15L);
  3784.  
  3785.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  3786.  
  3787.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3788.  
  3789.                                          break;
  3790.                                       }
  3791.  
  3792.                                       if (MyMenu & CYCLERIGHT_MSG)
  3793.                                       {
  3794.                                          ModifyIDCMP (Ilbm->win,IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY|IDCMP_MENUPICK);
  3795.  
  3796.                                          if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE);
  3797.  
  3798.                                          ClearMenuStrip (Ilbm->win);
  3799.  
  3800.                                          PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  3801.  
  3802.                                          Cycle (Ilbm->win,DELAY,SHIFTRIGHT);
  3803.  
  3804.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3805.  
  3806.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  3807.  
  3808.                                          if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE);
  3809.  
  3810.                                          LoadRGB32 (Ilbm->vp,PALETTE);
  3811.  
  3812.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3813.  
  3814.                                          break;
  3815.                                       }
  3816.  
  3817.                                       if (MyMenu & CYCLELEFT_MSG)
  3818.                                       {
  3819.                                          ModifyIDCMP (Ilbm->win,IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY|IDCMP_MENUPICK);
  3820.  
  3821.                                          if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE);
  3822.  
  3823.                                          ClearMenuStrip (Ilbm->win);
  3824.  
  3825.                                          PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  3826.  
  3827.                                          Cycle (Ilbm->win,DELAY,SHIFTLEFT);
  3828.  
  3829.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3830.  
  3831.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  3832.  
  3833.                                          if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE);
  3834.  
  3835.                                          LoadRGB32 (Ilbm->vp,PALETTE);
  3836.  
  3837.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  3838.  
  3839.                                          break;
  3840.                                       }
  3841.  
  3842.                                       if (MyMenu & DELAY_MSG)
  3843.                                       {
  3844.                                          while (1L)
  3845.                                          {
  3846.                                             DELAY = IntegerGad (Ilbm->win,"Cycle delay time requester","Insert cycle delay time... between 0 (fastest) and 200 (slowest)","_Delay time",DELAY);
  3847.  
  3848.                                             if ((DELAY >= 0L) && (DELAY <= 200)) break;
  3849.  
  3850.                                             DisplayBeep (Ilbm->scr);
  3851.                                          }
  3852.  
  3853.                                          break;
  3854.                                       }
  3855.  
  3856.                                       if (MyMenu & STOP_MSG)
  3857.                                       {
  3858.                                          SetMenuStart (Ilbm->win);
  3859.  
  3860.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3861.  
  3862.                                          break;
  3863.                                       }
  3864.  
  3865.                                       if (MyMenu & LOADPICTURE_MSG)
  3866.                                       {
  3867.                                          if (FileRequest (Ilbm->win,"Load iff picture","FLASHMANDEL:Pictures",PICTURES_DRAWER,FALSE))
  3868.                                          {
  3869.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  3870.  
  3871.                                             if (Ilbm->ParseInfo.iff = AllocIFF ())
  3872.                                             {
  3873.                                                SaveCoords (Ilbm->win,TRUE);
  3874.  
  3875.                                                if (! (Error = QueryMandPic (Ilbm,&MANDChunk,MYPATH)))
  3876.                                                {
  3877.                                                   RMIN = MANDChunk.RMin;
  3878.  
  3879.                                                   RMAX = MANDChunk.RMax;
  3880.  
  3881.                                                   IMIN = MANDChunk.IMin;
  3882.  
  3883.                                                   IMAX = MANDChunk.IMax;
  3884.  
  3885.                                                   JKRE  = MANDChunk.JKre;
  3886.  
  3887.                                                   JKIM  = MANDChunk.JKim;
  3888.  
  3889.                                                   MAX_ITERATIONS = MANDChunk.Iterations - 1L;
  3890.  
  3891.                                                   Fade (MYILBM.win,PALETTE,25L,1L,TOBLACK);
  3892.  
  3893.                                                   CloseDisplay (Ilbm,VINFO);
  3894.  
  3895.                                                   Ilbm->IFFPFlags = IFFPF_BESTFIT;
  3896.  
  3897.                                                   COLORS = MakeDisplay (Ilbm);
  3898.  
  3899.                                                   Ilbm->IFFPFlags = NULL;
  3900.  
  3901.                                                   if (! COLORS)
  3902.                                                   {
  3903.                                                      Fail (MakeDisplayError,20L);
  3904.  
  3905.                                                      MyMenu = EXIT_MSG;
  3906.  
  3907.                                                      break;
  3908.                                                   }
  3909.  
  3910.                                                   MASK &= ~ZMASK;
  3911.  
  3912.                                                   COLORS -= RESERVED_PENS;
  3913.  
  3914.                                                   if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE);
  3915.  
  3916.                                                   if (LoadMandPic (Ilbm,MYPATH)) Fail (LoadMandPicError,5L);
  3917.  
  3918.                                                   if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE);
  3919.  
  3920.                                                   GetRGB32 (Ilbm->vp->ColorMap,0L,(ULONG) Ilbm->vp->ColorMap->Count,PALETTE + 1L);
  3921.  
  3922.                                                   CheckMenu (Ilbm->win);
  3923.                                                }
  3924.  
  3925.                                                else Fail (QueryMandPicError,NULL);
  3926.  
  3927.                                                FreeIFF (Ilbm->ParseInfo.iff);
  3928.                                             }
  3929.                                          }
  3930.  
  3931.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3932.  
  3933.                                          break;
  3934.                                       }
  3935.  
  3936.                                       if (MyMenu & SAVEPICTURE_MSG)
  3937.                                       {
  3938.                                          if (FileRequest (Ilbm->win,"Save iff picture","FLASHMANDEL:Pictures",PICTURES_DRAWER,TRUE))
  3939.                                          {
  3940.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  3941.  
  3942.                                             if (Ilbm->ParseInfo.iff = AllocIFF ())
  3943.                                             {
  3944.                                                MANDChunk.LeftEdge = Ilbm->win->LeftEdge;
  3945.  
  3946.                                                MANDChunk.TopEdge = Ilbm->win->TopEdge;
  3947.  
  3948.                                                MANDChunk.Width = Ilbm->win->Width;
  3949.  
  3950.                                                MANDChunk.Height = Ilbm->win->Height;
  3951.  
  3952.                                                MANDChunk.RMin = RMIN;
  3953.  
  3954.                                                MANDChunk.RMax = RMAX;
  3955.  
  3956.                                                MANDChunk.IMin = IMIN;
  3957.  
  3958.                                                MANDChunk.IMax = IMAX;
  3959.  
  3960.                                                MANDChunk.JKre = JKRE;
  3961.  
  3962.                                                MANDChunk.JKim = JKIM;
  3963.  
  3964.                                                MANDChunk.Iterations = MAX_ITERATIONS + 1L;
  3965.  
  3966.                                                if (ZMASK & MASK)
  3967.                                                {
  3968.                                                   DrawBorder (Ilbm->wrp,&MYBORDER,0,0);
  3969.  
  3970.                                                   MASK &= ~ZMASK;
  3971.                                                }
  3972.  
  3973.                                                if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE);
  3974.  
  3975.                                                if (SaveMandPic (Ilbm,&SPECIAL_CHUNK,&USERNAME_CHUNK,MYPATH)) Fail (SaveMandPicError,5L);
  3976.  
  3977.                                                if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE);
  3978.  
  3979.                                                FreeIFF (Ilbm->ParseInfo.iff);
  3980.                                             }
  3981.                                          }
  3982.  
  3983.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3984.  
  3985.                                          break;
  3986.                                       }
  3987.  
  3988.                                       if (MyMenu & LOADPALETTE_MSG)
  3989.                                       {
  3990.                                          if (FileRequest (Ilbm->win,"Load palette","FLASHMANDEL:Palettes",PALETTES_DRAWER,FALSE))
  3991.                                          {
  3992.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  3993.  
  3994.                                             if (Ilbm->ParseInfo.iff = AllocIFF ())
  3995.                                             {
  3996.                                                if (LoadPalette (Ilbm,MYPATH)) Fail (LoadMandPalError,5L);
  3997.  
  3998.                                                GetRGB32 (Ilbm->vp->ColorMap,0L,(ULONG) Ilbm->vp->ColorMap->Count,PALETTE + 1L);
  3999.  
  4000.                                                FreeIFF (Ilbm->ParseInfo.iff);
  4001.                                             }
  4002.  
  4003.                                             else Fail (NoMem,5L);
  4004.                                          }
  4005.  
  4006.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  4007.  
  4008.                                          break;
  4009.                                       }
  4010.  
  4011.                                       if (MyMenu & SAVEPALETTE_MSG)
  4012.                                       {
  4013.                                          if (FileRequest (Ilbm->win,"Save palette","FLASHMANDEL:Palettes",PALETTES_DRAWER,TRUE))
  4014.                                          {
  4015.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  4016.  
  4017.                                             if (Ilbm->ParseInfo.iff = AllocIFF ())
  4018.                                             {
  4019.                                                if (SavePalette (Ilbm,©RIGHT_CHUNK,MYPATH)) Fail (LoadMandPalError,5L);
  4020.  
  4021.                                                FreeIFF (Ilbm->ParseInfo.iff);
  4022.                                             }
  4023.  
  4024.                                             else Fail (NoMem,5L);
  4025.                                          }
  4026.  
  4027.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  4028.  
  4029.                                          break;
  4030.                                       }
  4031.  
  4032.                                       if (MyMenu & FONTREQ_MSG)
  4033.                                       {
  4034.                                          if (FontRequest (Ilbm->win))
  4035.                                          {
  4036.                                             if (ZMASK & MASK)
  4037.                                             {
  4038.                                                DrawBorder (Ilbm->wrp,&MYBORDER,0,0);
  4039.  
  4040.                                                MASK &= ~ZMASK;
  4041.                                             }
  4042.  
  4043.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  4044.  
  4045.                                             MYBITMAP = CopyBitMap (Ilbm->win,Ilbm->win->LeftEdge,Ilbm->win->TopEdge,Ilbm->win->Width,Ilbm->win->Height);
  4046.  
  4047.                                             Fade (MYILBM.win,PALETTE,25L,1L,TOBLACK);
  4048.  
  4049.                                             CloseDisplay (Ilbm,VINFO);
  4050.  
  4051.                                             if (! MakeDisplay (Ilbm))
  4052.                                             {
  4053.                                                Fail (MakeDisplayError,20L);
  4054.  
  4055.                                                MyMenu = EXIT_MSG;
  4056.  
  4057.                                                break;
  4058.                                             }
  4059.  
  4060.                                             PasteBitMap (MYBITMAP,Ilbm->win,Ilbm->win->Width,Ilbm->win->Height);
  4061.                                          }
  4062.  
  4063.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  4064.  
  4065.                                          break;
  4066.                                       }
  4067.  
  4068.                                       if (MyMenu & DUMP_MSG)
  4069.                                       {
  4070.                                          ModifyIDCMP (Ilbm->win,NULL);
  4071.  
  4072.                                          ClearMenuStrip (Ilbm->win);
  4073.  
  4074.                                          PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  4075.  
  4076.                                          if (Choice (Ilbm->win,"Print requester","Are you sure ?"))
  4077.                                          {
  4078.                                             WinDump (Ilbm->win);
  4079.                                          }
  4080.  
  4081.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  4082.  
  4083.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  4084.  
  4085.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  4086.  
  4087.                                          break;
  4088.                                       }
  4089.  
  4090.                                       if (MyMenu & PREVIEW_MSG)
  4091.                                       {
  4092.                                          if (NewCoords (Ilbm->win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4],ZOOMLINE [5]))
  4093.                                          {
  4094.                                             ModifyIDCMP (Ilbm->win,NULL);
  4095.  
  4096.                                             ClearMenuStrip (Ilbm->win);
  4097.  
  4098.                                             Preview (Ilbm->win,Ilbm->win->Width,Ilbm->win->Height);
  4099.  
  4100.                                             ResetMenuStrip (Ilbm->win,MAINMENU);
  4101.  
  4102.                                             ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  4103.  
  4104.                                             RestoreCoords (Ilbm->win);
  4105.                                          }
  4106.  
  4107.                                          break;
  4108.                                       }
  4109.  
  4110.                                       if (MyMenu & COORDS_MSG)
  4111.                                       {
  4112.                                          ModifyIDCMP (Ilbm->win,NULL);
  4113.  
  4114.                                          ClearMenuStrip (Ilbm->win);
  4115.  
  4116.                                          if (ShowCoords (Ilbm->win))
  4117.                                          {
  4118.                                             if (Choice (Ilbm->win,"Rendering requester","Recalculate ?")) MyMenu |= REDRAW_MSG;
  4119.                                          }
  4120.  
  4121.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  4122.  
  4123.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  4124.                                       }
  4125.  
  4126.                                       if (MyMenu & UNDO_MSG) RestoreCoords (Ilbm->win);
  4127.  
  4128.                                       if (MyMenu & REDRAW_MSG)
  4129.                                       {
  4130.                                          if (ZMASK & MASK)
  4131.                                          {
  4132.                                             DrawBorder (Ilbm->wrp,&MYBORDER,0,0);
  4133.  
  4134.                                             MASK &= ~ZMASK;
  4135.                                          }
  4136.  
  4137.                                          SetMenuStop (Ilbm->win);
  4138.  
  4139.                                          PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  4140.  
  4141.                                          ELAPSEDTIME = DrawFractal (Ilbm->win,Ilbm->win->LeftEdge,Ilbm->win->TopEdge,Ilbm->win->Width,Ilbm->win->Height);
  4142.  
  4143.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  4144.  
  4145.                                          SetMenuStart (Ilbm->win);
  4146.  
  4147.                                          ShowTime (Ilbm->win,"Recalculate elapsed time:",ELAPSEDTIME);
  4148.  
  4149.                                          break;
  4150.                                       }
  4151.  
  4152.                                       if (MyMenu & DRAW_MSG)
  4153.                                       {
  4154.                                          if (ZMASK & MASK)
  4155.                                          {
  4156.                                             DrawBorder (Ilbm->wrp,&MYBORDER,0,0);
  4157.  
  4158.                                             MASK &= ~ZMASK;
  4159.                                          }
  4160.  
  4161.                                          if (NewCoords (Ilbm->win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4],ZOOMLINE [5]))
  4162.                                          {
  4163.                                             MYBITMAP = CopyBitMap (Ilbm->win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1);
  4164.  
  4165.                                             PasteBitMap (MYBITMAP,Ilbm->win,ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1);
  4166.  
  4167.                                             SetMenuStop (Ilbm->win);
  4168.  
  4169.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  4170.  
  4171.                                             ELAPSEDTIME = DrawFractal (Ilbm->win,Ilbm->win->LeftEdge,Ilbm->win->TopEdge,Ilbm->win->Width,Ilbm->win->Height);
  4172.  
  4173.                                             PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  4174.  
  4175.                                             SetMenuStart (Ilbm->win);
  4176.  
  4177.                                             ShowTime (Ilbm->win,"Zoom elapsed time:",ELAPSEDTIME);
  4178.                                          }
  4179.  
  4180.                                          break;
  4181.                                       }
  4182.  
  4183.                                       break;
  4184.  
  4185.              case       IDCMP_RAWKEY: if (MyCode == RAW_ESC) MyMenu = EXIT_MSG;
  4186.  
  4187.                                       if (MyCode == HELP) Execute (SHOWGUIDECOMMAND,NULL,NULL);
  4188.  
  4189.                                       break;
  4190.  
  4191.              case  IDCMP_CLOSEWINDOW: MyMenu = EXIT_MSG;
  4192.       }
  4193.  
  4194.     } while (! ((MyMenu & EXIT_MSG) || (MyMenu & NEWDISPLAY_MSG)));
  4195.  
  4196.  return MyMenu;
  4197. }
  4198.  
  4199. void FreeBitMapSafety (struct BitMap *Bitmap)
  4200. {
  4201.     WaitBlit ();
  4202.  
  4203.     FreeBitMap (Bitmap);
  4204. }
  4205.  
  4206. struct BitMap *CopyBitMap (struct Window *Win,WORD Left,WORD Top,WORD Width,WORD Height)
  4207. {
  4208. struct BitMap *NewBM;
  4209.  
  4210.   NewBM = AllocBitMap ((ULONG) Width,(ULONG) Height,(ULONG) Win->RPort->BitMap->Depth,BMF_INTERLEAVED | BMF_CLEAR | BMF_MINPLANES,Win->RPort->BitMap);
  4211.  
  4212.   if (NewBM)
  4213.   {
  4214.      if (ZMASK & MASK) DrawBorder (Win->RPort,&MYBORDER,0,0);
  4215.  
  4216.      if (TMASK & MASK) ShowTitle (Win->WScreen,FALSE);
  4217.  
  4218.      BltBitMap (Win->RPort->BitMap,Left,Top,NewBM,0,0,Width,Height,0xC0,0xFF,NULL);
  4219.  
  4220.      if (TMASK & MASK) ShowTitle (Win->WScreen,TRUE);
  4221.  
  4222.      if (ZMASK & MASK) DrawBorder (Win->RPort,&MYBORDER,0,0);
  4223.  
  4224.      MASK |= BMASK;
  4225.   }
  4226.  
  4227.   return NewBM;
  4228. }
  4229.  
  4230. BOOL PasteBitMap (struct BitMap *SrcBM,struct Window *DstWin,WORD SrcWidth,WORD SrcHeight)
  4231. {
  4232. BOOL Success = FALSE;
  4233.  
  4234. UWORD DstWinWidth,DstWinHeight;
  4235.  
  4236. struct BitMap *TmpBM;
  4237.  
  4238.   if (SrcBM && (MASK & BMASK))
  4239.   {
  4240.      DstWinWidth = ((DstWin->Flags & WFLG_GIMMEZEROZERO) ? DstWin->GZZWidth : DstWin->Width);
  4241.  
  4242.      DstWinHeight = ((DstWin->Flags & WFLG_GIMMEZEROZERO) ? DstWin->GZZHeight : DstWin->Height);
  4243.  
  4244.      TmpBM = AllocBitMap ((ULONG) DstWinWidth,(ULONG) DstWinHeight,(ULONG) DstWin->RPort->BitMap->Depth,BMF_INTERLEAVED | BMF_MINPLANES | BMF_CLEAR,DstWin->RPort->BitMap);
  4245.  
  4246.      if (TmpBM)
  4247.      {
  4248.         BSA.bsa_SrcWidth    = SrcWidth;
  4249.         BSA.bsa_SrcHeight   = SrcHeight;
  4250.         BSA.bsa_XSrcFactor  = SrcWidth;
  4251.         BSA.bsa_YSrcFactor  = SrcHeight;
  4252.         BSA.bsa_XDestFactor = DstWinWidth;
  4253.         BSA.bsa_YDestFactor = DstWinHeight;
  4254.         BSA.bsa_SrcBitMap   = SrcBM;
  4255.         BSA.bsa_DestBitMap  = TmpBM;
  4256.  
  4257.         BitMapScale (&BSA);
  4258.  
  4259.         BltBitMapRastPort (TmpBM,0,0,DstWin->RPort,0,0,DstWinWidth,DstWinHeight,0xC0);
  4260.  
  4261.         FreeBitMapSafety (TmpBM);
  4262.  
  4263.         Success = TRUE;
  4264.      }
  4265.  
  4266.      FreeBitMapSafety (SrcBM);
  4267.  
  4268.      MASK &= ~BMASK;
  4269.   }
  4270.  
  4271.   return Success;
  4272. }
  4273.  
  4274. LONG WinDump (struct Window *Win)
  4275. {
  4276. struct IODRPReq *IODrp;
  4277. struct MsgPort  *PrinterPort;
  4278. struct ViewPort *Vp;
  4279.  
  4280. LONG Error = PDERR_BADDIMENSION;
  4281.  
  4282.   if (! Win) return Error;
  4283.  
  4284.   if (PrinterPort = CreatePort (0,0))
  4285.   {
  4286.      if (IODrp = (struct IODRPReq *) CreateExtIO (PrinterPort,sizeof (struct IODRPReq)))
  4287.      {
  4288.         if (! (Error = OpenDevice ("printer.device",0,(struct IORequest *) IODrp,0)))
  4289.         {
  4290.            Vp = ViewPortAddress (Win);
  4291.  
  4292.            IODrp->io_Command   = PRD_DUMPRPORT;
  4293.            IODrp->io_RastPort  = Win->RPort;
  4294.            IODrp->io_ColorMap  = Vp->ColorMap;
  4295.            IODrp->io_Modes     = (ULONG) Vp->Modes;
  4296.            IODrp->io_SrcX      = Win->LeftEdge;
  4297.            IODrp->io_SrcY      = Win->TopEdge;
  4298.            IODrp->io_SrcWidth  = Win->Width;
  4299.            IODrp->io_SrcHeight = Win->Height;
  4300.            IODrp->io_DestCols  = 0;
  4301.            IODrp->io_Special   = SPECIAL_FULLCOLS | SPECIAL_ASPECT;
  4302.  
  4303.            Error = DoIO ((struct IORequest *)IODrp);
  4304.  
  4305.            CloseDevice ((struct IORequest *)IODrp);
  4306.         }
  4307.  
  4308.         DeleteExtIO ((struct IORequest *)IODrp);
  4309.      }
  4310.  
  4311.      DeletePort (PrinterPort);
  4312.   }
  4313.  
  4314.   return Error;
  4315. }
  4316.  
  4317.